首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gradle Tooling API -查找GradleProject的所有任务

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

Stack Overflow用户
提问于 2015-06-18 07:05:46
回答 3查看 1K关注 0票数 3

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

我已经设法实例化了gradle tooling API (连接器,GradleProject),但这两种方法都不能让我获得BuildLauncher可用的所有任务的简单列表(提示:有些任务可能在插件中)。但是,我设法运行了":tasks“任务,然后解析它的输出,但听起来很糟糕。

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

我是否遗漏了什么重要的东西,或者仅仅是工具API从来没有打算提供对gradle API的访问?

EN

回答 3

Stack Overflow用户

发布于 2015-06-18 14:33:16

看起来下面这段代码可能会对你有所帮助:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-06-24 23:34:17

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

它由运行": tasks“任务组成,该任务恰好将所有可用任务打印到它的stdout。不幸的是,并不是stdout的所有行都包含任务名称,但我不必处理这一点。

代码语言:javascript
复制
    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);
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2020-06-18 17:44:10

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

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

代码语言:javascript
复制
GradleProject project = connection.getModel(GradleProject.class);
for (Task task : project.getTasks()) {
    System.out.println("    " + task.getName());
}

这可能解释了为什么你只看到10个任务,而你期望的是20+任务。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30903947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档