Gradle 子模块的渐变子模块未使用:submodule:build语法生成
gradle正确地找到了以下项目结构: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
$ ./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子项目及其依赖的任何子项目 开
$。/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
dependsOnsub-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