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:
- move the ant.replace to task incr
- 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
。
我有一个包含子项目的项目。布局:
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:
- move the ant.replace to task incr
- 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
。