【问题标题】:Identifying the list of projects that have been invoked in gradle识别已在 gradle 中调用的项目列表
【发布时间】:2017-07-11 17:10:03
【问题描述】:

我有一个支持多项目的设置插件。它目前适用于settings.gradle 中确定的每个项目。但是,这是一个问题,因为每个子项目没有相同的配置,并且我通过-P 在命令行上设置的项目属性来控制一些插件行为。

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

除了迭代settings.gradle.allprojects,有没有办法知道哪些项目实际上已包含在构建中?例如当我这样做时:

gradle :subproject-name:build :other-subproject-name:build -PsomeProperty

我想知道只有 subproject-nameother-subproject-name 被调用,以便我可以将设置插件仅应用于这些项目。

或者有没有办法以某种方式将项目属性“限定”到特定项目?

【问题讨论】:

    标签: gradle multi-project project-properties


    【解决方案1】:

    ...有没有办法知道哪些项目实际包含在构建中?

    这是一种误解。当settings.gradle 包含所有项目时,所有项目都是构建的一部分,并且它们都将得到配置,因此它们具有关联的Project

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

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

    【讨论】:

    • 我担心会是这样;不幸的是,我拥有的插件是一个版本控制插件,我需要在配置任何任务之前配置项目版本,因为到那时为时已晚。我希望有一种方法可以指定项目属性只应用于特定项目。
    • @VivinPaliath 我不是 100% 清楚为什么需要在配置任务之前设置项目版本。最终,您可能需要重新考虑您的方法。在初始化阶段,即您尝试应用插件时,关于构建的信息非常有限。 project.version 可以在配置阶段设置,您将获得更多信息。您的任务(假设您也在定义它们)可以设置为在执行时读取 project.version 的值。
    • 您开始遇到后期配置问题。 jar 插件和 maven-publish 插件就是很好的例子。我的插件根据 git 标签设置版本,你传入某些属性来控制版本;即,碰撞主要、次要、补丁或预发布。如果我等待任务准备好,那么使用项目版本的任务将无法获得正确的版本,然后您最终不得不在afterEvaluate 中重新配置任务;这增加了用户的负担,因为他们现在必须知道哪些任务在配置时设置了版本。
    • 是的,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 的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多