Gradle 子模块的渐变子模块未使用:submodule:build语法生成

Gradle 子模块的渐变子模块未使用:submodule:build语法生成,gradle,Gradle,gradle正确地找到了以下项目结构: $ ./gradlew projects Root project 'test-project' \--- Project ':sub-1' \--- Project ':sub-1:sub-2' 这让我相信我的设置是正确的 现在,我发现以下gradle语法: $ ./gradlew clean :sub-1:build 不等同于: $ cd sub-1 $ ../gradlew clean build $ cd .. 上述内容在gradl

gradle正确地找到了以下项目结构:

$ ./gradlew projects
Root project 'test-project'
\--- Project ':sub-1'
     \--- Project ':sub-1:sub-2'
这让我相信我的设置是正确的

现在,我发现以下gradle语法:

$ ./gradlew clean :sub-1:build
不等同于:

$ cd sub-1
$ ../gradlew clean build
$ cd ..
上述内容在gradle网站的许多地方都有说明。 像

运行前者,结果不正确:

> Task :sub-1:test
test.project.LibrarySuite > someLibraryMethod is always true PASSED
运行后者,结果是正确的:

> Task :sub-1:test
test.project.LibrarySuite > someLibraryMethod is always true PASSED
> Task :sub-1:sub-2:test
test.project.LibrarySuite > someLibraryMethod is always true PASSED


请帮助我了解我是否假设或做了任何错误的事情,或者这是一个应该向gradle团队提出的错误。

您可以在此处找到gradle如何在多项目构建设置中处理任务执行的详细描述:,特别是:

从用户的角度来看,多项目构建仍然是集合 您可以运行的任务数。不同之处在于,您可能想要控制 执行哪个项目的任务。这里有两个选项:

  • 更改到与您正在执行的子项目对应的目录 对gradle感兴趣,并像平常一样执行gradle

  • 使用任何目录中的限定任务名称,尽管这通常是 从根本上完成。例如:gradle:services:webservice:build 将构建webservice子项目及其依赖的任何子项目 开

第一种方法类似于单个项目用例,但是 Gradle在多项目情况下的工作方式略有不同 建造。命令gradletest将以任何方式执行测试任务 子项目,相对于当前工作目录,具有 任务因此,如果从根项目目录运行该命令, 您将在api、shared和services中运行测试:shared和 服务:webservice。如果从服务项目运行该命令 目录中,您将仅在服务中执行任务:共享和 服务:webservice

这解释了Gradle在您问题中给出的两个示例中的行为:

  • $。/gradlew clean:sub-1:build

    从根项目目录:执行任务
    clean
    ,该任务将针对当前项目和下面的每个子项目执行,然后执行
    :sub-1:build
    (使用限定任务名称),该任务仅针对子项目
    sub1
    执行
    build
    任务

  • 梯度执行日志:

    > Task :clean UP-TO-DATE
    > Task :sub-1:clean
    > Task :sub-1:sub-2:clean UP-TO-DATE
    > Task :sub-1:compileJava NO-SOURCE
    > Task :sub-1:processResources NO-SOURCE
    > Task :sub-1:classes UP-TO-DATE
    > Task :sub-1:jar
    > Task :sub-1:assemble
    > Task :sub-1:compileTestJava NO-SOURCE
    > Task :sub-1:processTestResources NO-SOURCE
    > Task :sub-1:testClasses UP-TO-DATE
    > Task :sub-1:test NO-SOURCE
    > Task :sub-1:check UP-TO-DATE
    > Task :sub-1:build
    
    EDIT回答@Guido的评论:这也将构建任何其他项目
    sub-1
    取决于,因此
    /gradlew clean:sub-1:build
    也将触发
    sub-2
    的构建,如果
    sub-1
    项目依赖于
    sub-2

    sub-1 build.gradle

  • $cd sub-1和../gradlew干净构建
  • sub-1
    subproject目录,您触发任务
    clean
    然后
    build
    ,而不使用限定名称,因此这两个任务都将在当前项目和子项目上执行:

    格拉尔德输出:

    $ ../gradlew  clean build --console=plain
    > Task :sub-1:clean
    > Task :sub-1:sub-2:clean
    > Task :sub-1:compileJava NO-SOURCE
    > Task :sub-1:processResources NO-SOURCE
    > Task :sub-1:classes UP-TO-DATE
    > Task :sub-1:jar
    > Task :sub-1:assemble
    > Task :sub-1:compileTestJava NO-SOURCE
    > Task :sub-1:processTestResources NO-SOURCE
    > Task :sub-1:testClasses UP-TO-DATE
    > Task :sub-1:test NO-SOURCE
    > Task :sub-1:check UP-TO-DATE
    > Task :sub-1:build
    > Task :sub-1:sub-2:compileJava NO-SOURCE
    > Task :sub-1:sub-2:processResources NO-SOURCE
    > Task :sub-1:sub-2:classes UP-TO-DATE
    > Task :sub-1:sub-2:jar
    > Task :sub-1:sub-2:assemble
    > Task :sub-1:sub-2:compileTestJava NO-SOURCE
    > Task :sub-1:sub-2:processTestResources NO-SOURCE
    > Task :sub-1:sub-2:testClasses UP-TO-DATE
    > Task :sub-1:sub-2:test NO-SOURCE
    > Task :sub-1:sub-2:check UP-TO-DATE
    > Task :sub-1:sub-2:build
    
    

    谢谢你的回答!我不同意/不理解的过去是:@Guido您不理解的部分是什么?
    gradle:services:webservice:build
    将构建webservice子项目及其依赖的任何子项目。这难道不意味着
    gradle:sub-1:build
    也应该构建它的子项目sub-2吗?@Guido小心点,项目之间有两种关系:父/子项目关系(我在回答中描述的关系),用于根据调用的任务确定要执行的任务,以及“从何处”关系您可以调用gradle(当前目录)和Project dependency(请参阅)。因此:
    gradle:sub-1:build
    只有在
    sub-1
    dependsOn
    sub-2
    时才会生成
    sub-2
    (例如:
    {implementation Project(':sub-1:sub-2')}
    中的
    $ ../gradlew  clean build --console=plain
    > Task :sub-1:clean
    > Task :sub-1:sub-2:clean
    > Task :sub-1:compileJava NO-SOURCE
    > Task :sub-1:processResources NO-SOURCE
    > Task :sub-1:classes UP-TO-DATE
    > Task :sub-1:jar
    > Task :sub-1:assemble
    > Task :sub-1:compileTestJava NO-SOURCE
    > Task :sub-1:processTestResources NO-SOURCE
    > Task :sub-1:testClasses UP-TO-DATE
    > Task :sub-1:test NO-SOURCE
    > Task :sub-1:check UP-TO-DATE
    > Task :sub-1:build
    > Task :sub-1:sub-2:compileJava NO-SOURCE
    > Task :sub-1:sub-2:processResources NO-SOURCE
    > Task :sub-1:sub-2:classes UP-TO-DATE
    > Task :sub-1:sub-2:jar
    > Task :sub-1:sub-2:assemble
    > Task :sub-1:sub-2:compileTestJava NO-SOURCE
    > Task :sub-1:sub-2:processTestResources NO-SOURCE
    > Task :sub-1:sub-2:testClasses UP-TO-DATE
    > Task :sub-1:sub-2:test NO-SOURCE
    > Task :sub-1:sub-2:check UP-TO-DATE
    > Task :sub-1:sub-2:build