我有一个带有子项目的项目。布局:
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
- 将ant.replact移至任务增量
- 评论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
。