Доступ к содержимому build.gradle программно - PullRequest
0 голосов
/ 21 мая 2019

Есть ли у нас возможность прочитать содержимое файла build.gradle в java-программе.Я смог сделать что-то подобное в Maven, используя приведенный ниже код.Теперь я смотрю на варианты сделать то же самое в Gradle.Я попытался использовать Gradle-tooling-api, как описано ниже, но получил некоторые ошибки (не уверен, что я придерживаюсь правильного подхода).

чтение pom.xml с использованием MavenXpp3Reader

    ```FileReader fileReader;
    try {
        fileReader = new FileReader(destPath);
    } catch (FileNotFoundException fileNotFoundException) {
        fileNotFoundException.printStackTrace();
    }
    MavenXpp3Reader reader = new MavenXpp3Reader();
    Model pomModel = reader.read(fileReader);

    //close the file reader
    fileReader.close();
    ```

Пытался использовать gradle-tooling-api, как показано ниже, но получил приведенную ниже ошибку.

public class ToolingApiCustomModelPlugin implements Plugin<Project> {
    private final ToolingModelBuilderRegistry registry;

    @Inject
    public ToolingApiCustomModelPlugin(ToolingModelBuilderRegistry registry) {
        this.registry = registry;
    }

    @Override
    public void apply(Project project) {
        registry.register(new CustomToolingModelBuilder());
    }

    private static class CustomToolingModelBuilder implements ToolingModelBuilder {
        @Override
        public boolean canBuild(String modelName) {
            return modelName.equals(CustomModel.class.getName());
        }

        @Override
        public Object buildAll(String modelName, Project project) {
            List<String> pluginClassNames = new ArrayList<String>();

            for(Plugin plugin : project.getPlugins()) {
                pluginClassNames.add(plugin.getClass().getName());
            }

            return new DefaultModel(pluginClassNames);
        }
    }
}

public static void main(String[] args) {
        GradleConnector connector = GradleConnector.newConnector();
        connector.forProjectDirectory(new File("./sample"));
        ProjectConnection connection = null;

        try {
            connection = connector.connect();
            ModelBuilder<CustomModel> customModelBuilder = connection.model(CustomModel.class);
            //customModelBuilder.withArguments("--init-script", "init.gradle");
            CustomModel model = customModelBuilder.get();    
}   

Исключение в потоке "main" org.gradle.tooling.UnknownModelException: модель типа 'CustomModel' недоступна вэта сборка.

Вызывается: org.gradle.tooling.provider.model.UnknownModelException: нет доступных сборщиков для построения модели типа 'org.gradle.sample.toolingapi.CustomModel'.

1 Ответ

1 голос
/ 21 мая 2019

Весь файл build.gradle преобразуется в объект project во время фазы инициализации сборки :

Между проектами существует отношение один к одномуи файл "build.gradle".Во время инициализации сборки Gradle собирает объект Project для каждого проекта, который должен участвовать в сборке

Таким образом, вы можете получить доступ к любой конфигурации (неявной или явной) из вашего build.gradle, обратившись к программному project объектная модель после перевода файла build.gradle, во время фаза выполнения

Вы можете сделать это с помощью специального подключаемого модуля Gradle или простого типа Gradle прямо внутри build.gradle (кажется рекурсивным, но именно поэтому у вас есть фазы для разделения чтения файла и доступа к объекту project.

Вставьте следующую задачу в ваш build.gradle и выполните ее в командной строке (диагностика Gradle), чтобывыведите все plugins, configurations и имена tasks, присутствующие в файле build.gradle:

task diagnostics {
    doLast {
        println project.plugins
        println project.tasks*.name
        println project.configurations
    }
}

Эти ссылки помогут вам проверить, как перейти к различным свойствам внутри грейдера.project объект:

Fили свойства и методы, предоставляемые другими плагинами, вы должны сначала обратиться к плагину, а затем обратиться к соответствующей документации, чтобы следовать оттуда.Наконец, плагины могут регистрировать то, что известно как extensions прямо в объекте проекта, так что вы можете обращаться к ним как к прямым свойствам project.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...