Gradle项目,子项目反复执行



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

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:你好


gradle -q subproj2:你好


gradle

来自rootproj,我总是得到,例如

....
从Subproj1:24
构建dir:d: rootproj subproj2 build
从subproj1:25
构建dir:d: rootproj subproj2 build

1。为什么两个子项目总是被执行两次,因此构建号是两次增量,而不是一次?
2.为什么即使我明确指定了该项目:命令行中的任务,为什么都将执行所有子项目?
我已经搜索了互联网,找不到有用的信息。
感谢您提前的帮助。

编辑:@jb nizet建议:

chand build.gradle
  1. 将ant.replact移至任务增量
  2. 评论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和Subproject 2。您根本不应该有subprojects

相关内容

  • 没有找到相关文章