每个项目重复Gradle子项目和所有项目?

时间:2016-02-01 19:35:41

标签: maven gradle

所以看来如果我:

  1. 创建一个“配置文件”(类似于maven)脚本,并且在配置文件中没有任何内容,只有println。
  2. 然后调用它并指定该配置文件。
  3. 每个子项目打印一次输出,或者每个项目打印一次,具体取决于加载该配置文件的代码是否位于allprojects {}subprojects{}。这很糟糕。我怎么能让它运行一次,只运行一次但是限定所有项目?请说我不会坚持这个。我们有一个非常大的构建。现在它比maven慢了。速度是这种转换的原因,所以我很自然地在寻找优化。

2 个答案:

答案 0 :(得分:0)

您需要就问题进行更多协作。你使用什么样的档案? Gradle并不真正拥有这些,你只是根据使用的属性有条件地应用逻辑。如果您只想为构建运行一些代码,您仍然可以在allprojectssubprojects之外的主要部分轻松完成此操作

即:

//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属性,则所有子项目都可以访问它。这可以让你做各种技巧。大多数情况下,我使用它来设置项目范围的变量,就像在运行构建任务后应该放置库文件的位置。