确定已在gradle中调用的项目列表

确定已在gradle中调用的项目列表,gradle,multi-project,project-properties,Gradle,Multi Project,Project Properties,我有一个多项目感知的设置插件。它目前适用于settings.gradle中标识的每个项目。然而,这是一个问题,因为每个子项目没有相同的配置,我通过-P在命令行上设置项目属性来控制一些插件行为 问题是,在没有使用该属性所需的配置的项目上,这会失败,我知道通过命令行将属性应用于特定子项目的方法 有没有一种方法可以代替迭代settings.gradle.allprojects,来了解哪些项目实际上已作为构建的一部分包含在其中?例如,当我这样做时: gradle:子项目名称:build:其他子项目名称

我有一个多项目感知的设置插件。它目前适用于
settings.gradle
中标识的每个项目。然而,这是一个问题,因为每个子项目没有相同的配置,我通过
-P
在命令行上设置项目属性来控制一些插件行为

问题是,在没有使用该属性所需的配置的项目上,这会失败,我知道通过命令行将属性应用于特定子项目的方法

有没有一种方法可以代替迭代
settings.gradle.allprojects
,来了解哪些项目实际上已作为构建的一部分包含在其中?例如,当我这样做时:


gradle:子项目名称:build:其他子项目名称:build-PsomeProperty

我想知道只调用了
子项目名称
其他子项目名称
,以便我可以将设置插件仅应用于这些项目

或者,是否有一种方法可以以某种方式将项目属性“范围”到某个特定的项目

。。。有没有办法知道哪些项目实际上已经作为构建的一部分包括在内

这是一种误解。当
设置时,所有项目都是构建的一部分。gradle
包括它们,并且它们都将被配置为具有关联的
项目

您最终要寻找的是,给定将要执行的任务,拥有这些任务的子项目是什么?为此,您可以抓取Gradle的任务图,对于将要执行的所有任务,找到拥有每个任务的项目

gradle.taskGraph.whenReady { graph ->
    def projects = graph.allTasks.collect { it.project }.toSet()
    projects.each {
        println "Project is being used in this build: " + it
    }
}

我担心情况会是这样;不幸的是,我的插件是一个版本控制插件,我需要在配置任何任务之前配置项目版本,因为到那时就太晚了。我希望有一种方法可以指定项目属性只能应用于特定的项目。@VivinPalath我不完全清楚为什么在配置任务之前需要设置项目版本。最终,您可能需要重新考虑您的方法。在初始化阶段,即尝试应用插件时,关于构建的信息非常有限<代码>项目。可以在配置阶段设置版本
,您将获得更多信息。您的任务(假设您也在定义它们)可以设置为在执行时读取
project.version
的值。您开始遇到后期配置问题。jar插件和maven发布插件就是很好的例子。我的插件基于git标签设置版本,你可以传入某些属性来控制版本控制;i、 .e,碰撞主要、次要、补丁或预发布。如果我等待任务准备就绪,那么使用项目版本的任务将无法获得正确的版本,然后您必须在
评估后重新配置任务;这增加了用户的负担,因为他们现在必须知道哪些任务在配置时设置了版本。是的,
afterEvaluate
绝对不是您想要的途径。但是,以您的示例运行时,配置默认JAR任务的java插件应该使用约定映射进行设置,以便在执行期间接收
project.version
的值。我刚刚在一个测试构建中尝试了
gradle.taskGraph.whenReady{project.version=“1.2.3”}
,它生成了一个名为
test-1.2.3.JAR
的JAR。我现在理解得更清楚了。希望能够轻松使用
project.version
的用户会感到意外,因为他们无法立即使用它,但需要懒洋洋地评估它。也许随着Gradle 4.0和PropertyState的引入,您将能够使用它的修改版本作为支持
project.version
的对象。