gpt4 book ai didi

未使用 :submodule:build syntax 构建的子模块的 gradle 子模块

转载 作者:行者123 更新时间:2023-12-03 04:08:50 25 4
gpt4 key购买 nike

我有以下由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 网站上很多地方都说明的等价性。
点赞 HERE
运行前者,结果不正确:
> 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 如何处理多项目build设置中的任务执行的详细说明:https://docs.gradle.org/current/userguide/intro_multi_project_builds.html#sec:executing_a_multiproject_build ,特别是:

From a user’s perspective, multi-project builds are still collectionsof tasks you can run. The difference is that you may want to controlwhich project’s tasks get executed. You have two options here:

  • Change to the directory corresponding to the subproject you’reinterested in and just execute gradle as normal.

  • Use a qualified task name from any directory, although this is usuallydone from the root. For example: gradle :services:webservice:buildwill build the webservice subproject and any subprojects it dependson.

The first approach is similar to the single-project use case, butGradle works slightly differently in the case of a multi-projectbuild. The command gradle test will execute the test task in anysubprojects, relative to the current working directory, that have thattask. So if you run the command from the root project directory,you’ll run test in api, shared, services:shared andservices:webservice. If you run the command from the services projectdirectory, you’ll only execute the task in services:shared andservices:webservice.


这解释了 Gradle 在您在问题中给出的两个示例中的行为方式:
  • $ ./gradlew clean :sub-1:build从项目根目录:你执行任务clean ,将对当前项目和下面的每个子项目执行,然后:sub-1:build (带有限定任务名称)执行build仅针对子项目 sub1 的任务

  • Gradle 执行日志:
    > 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
    编辑 回答@Guido 的评论:这也将构建任何其他项目 sub-1取决于,所以 ./gradlew clean :sub-1:build还将触发 sub-2 的构建如果 sub-1项目 依赖 sub-2 :
    sub-1 build.gradle
    dependencies {
    implementation project(":sub-1:sub-2")
    }
  • $ cd sub-1 && ../gradlew clean build

  • 来自 sub-1子项目目录,你触发任务 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

    关于未使用 :submodule:build syntax 构建的子模块的 gradle 子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62597977/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com