Gradle 项目、子项目重复执行

Gradle project, sub projects executed repeatedly

我有一个包含子项目的项目。布局:

rootproj
--subproj1
----mybuild.number
--subproj2
--build.gradle
--gradle.properties
--settings.gradle

mybuild.number

#Build Number for ANT. Do not edit!
#Wed Nov 210 2121:210:2121 PST 2102121
build.number=1

settings.gradle

include ('subproj1', 'subproj2')

build.gradle

allprojects {

    repositories {
        mavenLocal()
        maven {url "http://repo1.maven.org/maven2"}
    }


}

subprojects {

    project (':subproj1')   { 

        def oldN = new File("D:/rootproj/subproj1/mybuild.number").text.split("=")[1]
        def newN = (oldN.toInteger() + 1).toString()
        ant.replace(
            file: "mybuild.number",
            token: "${oldN}",
            value: "${newN}"
        )
        println "From subproj1 : ${newN}"
        task hello(overwrite: true){
            doLast{
                println "hello from subproject 1"
            }
        }

    }
    project (':subproj2'){

        println "the build Dir: $buildDir"
        task hello(overwrite: true){
            doLast{
                println "hello from subproject 2"
            }
        }

    }
}

当我运行

gradle -q subproj1:hello


gradle -q subproj2:hello


gradle

从 rootproj,我总是得到例如

....
From subproj1 : 24
the build Dir: D:\rootproj\subproj2\build
From subproj1 : 25
the build Dir: D:\rootproj\subproj2\build

1.为什么两个子项目总是执行两次,因此内部版本号增加两次,而不是一次?
2. 即使我在命令行中明确指定了 project:task 为什么所有的子项目都会执行?
我在网上搜索过,找不到有用的信息。
提前感谢您的帮助。

编辑: 按照@JB Nizet 的建议更改 build.gradle:

  1. move the ant.replace to task incr
  2. comment out subprojects

它完全符合我的预期。

    allprojects {
    repositories {
        mavenLocal()
        maven {url "http://repo1.maven.org/maven2"}
    }
}

//subprojects {
    def oldN = new File("E:/hqin/build/gradle/rootproj/subproj1/mybuild.number").text.split("=")[1]
    def newN = (oldN.toInteger() + 1).toString()
    project (':subproj1')   { 

        task incr {
            doLast{

                ant.replace(
                    file: "mybuild.number",
                    token: "${oldN}",
                    value: "${newN}"
                )
            }
            println "From subproj1 : ${newN}"
        }
        task hello(overwrite: true, dependsOn: 'incr'){
            doLast{
                println "hello from subproject 1"
            }
        }

    }
    project (':subproj2'){


        task hello(overwrite: true){
            doLast{
                println "the build Dir: $buildDir"
                println "hello from subproject 2"
            }
        }

    }
//}

关于第二点:因为你的代码是 运行 作为项目配置的一部分,无论执行什么任务,它总是 运行。如果您希望在执行任务时执行代码,那么它应该在任务定义的 doLast 闭包内:

task someTask {
  doLast {
    ...
  }
}

关于第一点:传递给 subprojects 的闭包会为每个子项目执行。所以,它为子项目1调用了一次,并配置了子项目1和子项目2,然后为子项目2再次调用,并重新配置了子项目1和子项目2。你根本不应该 subprojects