Gradle插件可以修改多模块项目中的子项目列表吗?

时间:2014-07-17 20:59:15

标签: gradle multi-module

我已经将以下build.gradlesettings.gradle的组合混合在一起,用于从多个单模块项目(例如,应用程序及其所有依赖项)中创建临时多模块项目,或共享库以及使用该库的所有内容。)

settings.gradle

// find all subprojects and include them
rootDir.eachFileRecurse { 
  if (it.name == "build.gradle") { 
    def projDir = it.parentFile
    if (projDir != rootDir) { 
      include projDir.name
      project(":${projDir.name}").projectDir = projDir
    }
  }
}

build.gradle:

// Make sure we've parsed subproject dependencies
evaluationDependsOnChildren()

// Map of all projects by artifact group and name
def declarationToProject = subprojects.collectEntries { p -> [toDeclaration(p), p] }

// Replace artifact dependencies with subproject dependencies, if possible
subprojects.each { p ->
  def changes = [] // defer so we don't get ConcurrentModificationExceptions
  p.configurations.each { c ->
    c.dependencies.each { d ->
      def sub = declarationToProject[[group:d.group, name:d.name]]
      if (sub != null) {
        changes.add({
            c.dependencies.remove(d)
            p.dependencies.add(c.name, sub)
        })
      }
    }
  }
  for (change in changes) {
    change()
  }
}

这很有用,但很难分享 - 如果其他人想要做类似的事情,他们必须复制我的*.gradle文件或剪切和粘贴。

我想要做的是采用此功能并将其封装在插件中。 build.gradle部分在插件apply()方法中看起来很容易,但在插件获得机会之前,子项目列表似乎已经完成了。有没有办法在构建过程的早期阶段进入,例如申请Project以外的其他内容?或者我应该让自己给我的插件一个覆盖settings.gradle的任务?


解决方案:根据Peter Niederweiser's answer,我将上面的代码移到了两个插件中,一个从settings.gradle调用,另一个从build.gradle调用。在settings.gradle:

buildscript {
    repositories { /* etc... */ }
    dependencies { classpath 'my-group:my-plugin-project:1.0-SNAPSHOT' }
}

apply plugin: 'find-subprojects'

并在build.gradle:

buildscript {
    repositories { /* etc... */ }
    dependencies { classpath 'my-group:my-plugin-project:1.0-SNAPSHOT' }
}

evaluationDependsOnChildren()
apply plugin: 'local-dependencies'

请注意,从settings.gradle调用插件在Gradle 1.11或1.12中不起作用,但在Gradle 2.0中有效。

1 个答案:

答案 0 :(得分:1)

您需要在settings.gradle中应用插件,我相信在最近的版本中支持该插件。