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

标签 gradle multi-module

我已经破解了 build.gradle 的组合和 settings.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 中起作用。

最佳答案

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

关于gradle - Gradle 插件可以修改多模块项目中的子项目列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24813415/

相关文章:

gradle - 如何获取详细的 Gradle 配置文件数据?

groovy - Gradle:获取传递依赖项并导出到最小的运行时 fat jar

android - 错误 : cannot find symbol import dagger. hilt.android.components.ApplicationComponent;

plugins - Gradle for Maven 提供的范围缺少 OOTB 支持。 Spring 的 Gradle propdeps-plugin 未按预期运行

java - 如何在maven多模块项目中构建依赖模块

android - Gradle 构建一组 Android 项目(包括库)

gradle - 使用 Gradle 的多个版本的库

android - 从自定义 Gradle 插件中动态添加构建风格

intellij-idea - Intellij IDEA 12.1.6+ Gradle 1.9 中的 "Cannot resolve symbol"

code-coverage - 非 Web 服务模块的 Sonar + jacoco 代理代码覆盖率