当前位置: 首页 > 知识库问答 >
问题:

多模块渐变构建中有条件跳过子项目

夔波
2023-03-14

考虑以下Gradle项目结构:

- root
|- build.gradle
|- barProject
 |- build.gradle
|- fooProject
 |- build.gradle

根在哪里构建。gradle的子项目配置如下:

subprojects {
    apply plugin: 'java'

    //bunch of other stuff
}

现在,当我在根项目上调用gradlew build时,它会自动配置两个子项目,然后构建它们——一切都很好。

我也知道我可以用各种方法跳过一个特定的任务(onlyIF()[taskName]。启用=false等),但是当我使用build上的任何一个时,Gradle仍然运行所有依赖的任务(CompileJavaProcResources等),直到最后击中build,然后跳过。

我的问题是,有没有办法让Gradle在配置阶段结束后立即停止并转到下一个子项目?

编辑:

澄清;每个子项目都有一个名为skip的属性,该属性在配置阶段进行评估。

现在,当我在根项目上调用gradlew build时,理想情况下,我希望Gradle检查该属性,如果它是真的,那么就完全跳过相应的项目。

Executing external task 'build'...

//check project.skip -> IF true -> skip project, go to :foo ELSE continue
:bar:compileJava
:bar:processResources UP-TO-DATE
:bar:classes
:bar:jar
:bar:startScripts
:bar:distTar
:bar:distZip
:bar:assemble
:bar:compileTestJava UP-TO-DATE
:bar:processTestResources UP-TO-DATE
:bar:testClasses UP-TO-DATE
:bar:test UP-TO-DATE
:bar:check UP-TO-DATE
:bar:build

//check project.skip -> IF true -> skip project, go to end ELSE continue
:foo:compileJava
:foo:processResources UP-TO-DATE
:foo:classes
:foo:jar
:foo:startScripts
:foo:distTar
:foo:distZip
:foo:assemble
:foo:compileTestJava UP-TO-DATE
:foo:processTestResources UP-TO-DATE
:foo:testClasses UP-TO-DATE
:foo:test UP-TO-DATE
:foo:check UP-TO-DATE
:foo:build

BUILD SUCCESSFUL

我希望这更有意义

共有1个答案

傅志诚
2023-03-14

首先,一个简单的解决方案是准确地调用您需要的任务。在简单的Gradle构建中,任务名称是唯一的。然而,在多项目构建中,每个项目都可以有一个具有特定名称的任务。这就是Gradle引入任务路径的原因。任务路径将唯一的项目路径与项目内唯一的任务名称相结合::projectX:taskY

使用项目路径,可以轻松指定要执行的特定于项目的任务::为根项目中的build任务指定build,以及

要执行的任务名称由Gradle设置的StartParameter对象管理。这些设置可以在设置中修改。gradle文件,其中还包括子项目:

include ':foo', ':bar'

startParameter.excludedTaskNames += ':foo:build'

此行将foo子项目的build任务从执行中排除。如果满足特定条件,可以将子项目任务路径(甚至独立于任务名称)添加到排除的任务名称中。但是,我没有找到访问构建文件中的设置的方法,因此在配置阶段无法使用此解决方案。但是,如果您的条件仅基于项目/系统属性,则可以从设置访问它们。格雷德尔

我想到了配置阶段的另一个解决方案,但它基本上就是你已经提到的,因为它简单地跳过了任务:

if (project.skip) {
    project.tasks.all { task -> task.enabled = false }
}

这样,项目中的所有任务(不仅是构建任务任务)都将被跳过。

请考虑,这些任务也可以执行,因为它们为另一个项目创建了一个依赖项。如果foobar的项目依赖项,则即使gradle:bar:build也将执行任务:foo:jar及其任务依赖项。您可以使用Gradle命令行选项-a-no rebuild设置中的以下条目禁用此行为。格雷德尔

startParameter.buildProjectDependencies = false

 类似资料:
  • 问题内容: 我们需要能够在某些环境中跳过子模块。 有问题的模块包含集成测试,并且需要半小时才能运行。因此,我们希望在CI服务器上进行构建时将其包括在内,但是当开发人员在本地进行构建(并运行测试)时,我们希望跳过该模块。 有没有办法通过配置文件设置来做到这一点?我已经进行了一些谷歌搜索,并在这里查看了其他问题/答案,但没有找到一个好的解决方案。 我想一个选择是从父级中完全删除该子模块,然后在CI服务

  • 请注意:“我编辑了这个问题” 我正在观察一个非常奇怪的情况。我在Jenkins中配置了两个具有相同配置的作业,但其中一个是连续构建,另一个是夜间构建[poll scm configured@middign]使用Sonarqube配置生成报告。 注意:我使用的是maven 3.3.1版本和SonarQube 5.1

  • 嗨我在网上搜了一遍,看了一堆文章,所以问题和文档都找不到解决办法,这里是我的问题。 我有一个多模块maven项目,其中包含三个模块a、B和C,a和B独立,C依赖于a和B,当然我有一个父项目。我还设置了一个jenkins服务器来构建这些项目,以及一个nexus存储库。 如有任何帮助,不胜感激。谢谢!

  • 主要内容:1- 介绍,2- 示例模型,3-创建项目数学库,4- 创建另一个项目:MathWebApp,5- 创建GradleMain项目,6- 构建项目,7- 运行MathWebApp1- 介绍 本教程文章基于: Eclipse Java EE IDE for Web Developers. Version: Mars.1 Release (4.5.1) 如果您是初学者Gradle的。那么建议先看看初学者Gradle(Gradle Hello world)的文章: http://www.yiib

  • 我有一个Jenkins/Maven/Git多模块项目,其中包含一个子模块(由承包商开发,没有什么可以改变它)。由于Git和子模块,我必须使用命令“Git Clone-recursive ssh://xxxxxxx.Git”在Linux中克隆repo。 这意味着我必须检查Jenkins Git插件选项“Advanced sub-modules Behavious”和“recursivy update

  • 有一个带有几个嵌套级别的maven多模块项目。当我跑的时候 有些项目是用日志消息生成的 分叉构建的项目让我很头疼,因为它没有在构建的JAR上调用mvn-install-plugin,因此没有将其中一些复制到本地maven存储库中。