Gradle Tooling API - 查找GradleProject的所有任务

时间:2015-06-17 23:05:46

标签: java intellij-idea gradle gradle-tooling-api

我完全被困在这里。我正在编写一个应该操纵gradle构建的java类。

我设法实例化了gradle工具API(Connector,GradleProject),但这些都不能让我得到BuildLauncher可用的所有任务的简单列表(提示:一些任务可能在插件中) )。但是,我设法运行":任务"任务,然后解析它的输出,但听起来很糟糕。

其中一个想法是以某种方式获得org.gradle.api.Project参考,但我也无法做到。

我是否遗漏了一些重要内容,或者只是工具API从未打算提供对gradle API的访问权限?

3 个答案:

答案 0 :(得分:1)

以下代码似乎可以帮助您:

GradleConnector connector = GradleConnector.newConnector();
connector.forProjectDirectory(new File(".")); // project dir

ProjectConnection connection = connector.connect();
try {
   // Load the model for the project
   GradleProject project = connection.getModel(GradleProject.class);
   System.out.println("Project: " + project.getName());
   System.out.println("Tasks:");
   for (Task task : project.getTasks()) {
       System.out.println("    " + task.getName());
    }
 } finally {
    // Clean up
    connection.close();
 }

基本上你需要获得模型。另请查看 $ GRADLE_HOME / sample / toolingApi 下的示例。

答案 1 :(得分:0)

我讨厌回答我自己的问题,而且我已经提到我对这个解决方案不满意,但是这里有人需要它。我不接受它。

它包括运行“:tasks”任务,恰好将所有可用任务打印到它的标准输出。不幸的是,并非stdout的所有行都包含任务名称,但我没有必要处理它。

    OutputStream outputStream = new OutputStream() {
        private StringBuilder string = new StringBuilder();
        @Override
        public void write(int b) throws IOException {
            this.string.append((char) b);
        }
        public String toString() {
            return this.string.toString();
        }
    };

    ProjectConnection connection = GradleConnector.newConnector()
            .forProjectDirectory(getProjectDirectoryFile())
            .connect();

    BuildLauncher buildLauncher = connection.newBuild();
    buildLauncher.forTasks(":tasks");

    buildLauncher.setStandardOutput(outputStream);
    buildLauncher.run();

    for (String line : outputStream.toString().split("\\r?\\n")) {
        if(containsTaskName(line)) {
            String taskName = line.split(" ")[0];
            System.out.println(taskName);
        }
    }

答案 2 :(得分:0)

如果您运行gradle :tasks,它将列出所有项目的任务。

如果执行以下操作,它将仅列出根项目的任务:

GradleProject project = connection.getModel(GradleProject.class);
for (Task task : project.getTasks()) {
    System.out.println("    " + task.getName());
}

这也许可以解释为什么当您期望有20多个任务时为什么只看到10个任务。

要列出所有任务,您需要遍历所有项目。

由于项目层次结构是一棵树,因此您可能需要使用递归来遍历树结构。

您可以使用project.getChildren()列出子项目节点并遍历/遍历树。在每个项目节点上,您都可以使用project.getTasks()来获取任务。