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
文件或剪切粘贴
我想做的是将这个功能封装在一个插件中。在pluginapply()
方法中,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中起作用,那太好了。非常感谢。