所以看来如果我:
每个子项目打印一次输出,或者每个项目打印一次,具体取决于加载该配置文件的代码是否位于allprojects {}
或subprojects{}
。这很糟糕。我怎么能让它运行一次,只运行一次但是限定所有项目?请说我不会坚持这个。我们有一个非常大的构建。现在它比maven慢了。速度是这种转换的原因,所以我很自然地在寻找优化。
答案 0 :(得分:0)
您需要就问题进行更多协作。你使用什么样的档案? Gradle并不真正拥有这些,你只是根据使用的属性有条件地应用逻辑。如果您只想为构建运行一些代码,您仍然可以在allprojects
或subprojects
之外的主要部分轻松完成此操作
即:
//file: $root/build.gradle
if (project.hasProperty('profile1')) {
apply from: file("$rootDir/profile1.gradle")
}
...
//file: $root/settings.gradle
rootProject.name = 'test'
include ':first'
include ':second'
...
//file: $root/profile1.gradle
allprojects {
println 'allprojects: ' + project.name
}
subprojects {
println 'subprojects: ' + project.name
}
println 'once: ' + project.name
...
//$root/first/build.gradle
//empty
...
//$root/second/build.gradle
//empty
比跑
gradle build -Pprofile1
您将获得以下内容:
allprojects: test
allprojects: first
allprojects: second
subprojects: first
subprojects: second
once: test
正如您所期望的那样......
答案 1 :(得分:0)
如果我能正确理解您的问题,那么以下内容中的内容可以帮助您:
// in root build.gradle
ext.taskRan = false
subprojects {
build.doFirst{
if (! rootProject.ext.taskRan ) {
rootProject.ext.taskRan = true
println "do task"
}
}
如果在根build.gradle中创建ext属性,则所有子项目都可以访问它。这可以让你做各种技巧。大多数情况下,我使用它来设置项目范围的变量,就像在运行构建任务后应该放置库文件的位置。