Gradle插件能否修改多模块项目中的子项目列表?

Gradle插件能否修改多模块项目中的子项目列表?,gradle,multi-module,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

我将下面的
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
文件或剪切粘贴

我想做的是将这个功能封装在一个插件中。在plugin
apply()
方法中,
build.gradle
部分看起来很简单,但在插件有机会使用它之前,子项目列表似乎已经一成不变了。是否有任何方法可以在构建过程的早期介入,例如,通过应用于
项目以外的其他项目
?或者我应该让我的插件承担一项覆盖
设置.gradle
的任务吗


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

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

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

evaluationDependsOnChildren()
apply plugin: 'local-dependencies'
build.gradle:

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

apply plugin: 'find-subprojects'
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
中应用插件,我相信这在最新版本中是受支持的。

我几乎100%确定您只能在设置文件中执行此操作,至少使用当前的Gradle 1.x/2.x版本。当然,您可以随时使用fork Gradle并提交拉取请求。:)听起来很有希望。我已经实现了一个
插件
,但不知道如何加载它(找不到id为“my Plugin”的
插件
)。我想这可能是因为使用了完全限定的类名而不是ID,我仍然没有找到ID为“mypackage.MyPluginClass”的插件。我应该使用另一种机制来注册插件吗?PS,我在同一个JAR中有一个
插件
,并且
构建。gradle
发现这个机制很好。你在
设置中有
构建脚本
块吗?gradle
,你试过最新的gradle吗?在1.12中不起作用,但在2.0中起作用,那太好了。非常感谢。