我有一个包含两个子对象的项目:gradle-plugin
和plugin-consumer
。我想将插件从gradle-plugin
应用到plugin-consumer
。我试着这样做:
// plugin-consumer/build.gradle
buildscript {
dependencies {
classpath project(':gradle-plugin')
}
}
apply plugin: 'my.plugin.id'
但我遇到了以下错误:
A problem occurred configuring project ':plugin-consumer'.
> Cannot use project dependencies in a script classpath definition.
我认为这是不受支持的,因为在配置plugin-consumer
之前,它需要完全构建gradle-plugin
。
幸运的是,我可以使用fileTree
依赖项来实现我的目标:
// plugin-consumer/build.gradle
buildscript {
dependencies {
classpath fileTree(includes: ['*.jar'], dir: '../gradle-plugin/build/libs')
}
}
apply plugin: 'my.plugin.id'
这是有效的,但感觉像是一个巨大的黑客攻击,并导致"自举问题"。
例如,我不能clean
gradle-plugin
,因为(已删除的(jar文件是配置plugin-consumer
所必需的,必须这样做才能(重新(构建gradle-plugin
。幸运的是,总是在clean
之后立即运行build
(可以说是在相同的"运行"中(,可以避免这种情况。这可以手动完成(gradle clean build
(或自动完成(使用clean.finalizedBy(build)
(。同样,这个工作,但感觉像黑客。
最后,我的实际问题是:有更好的方法吗?
请注意,gradle-plugin
是一个独立的插件,不仅由plugin-consumer
使用,因此buildSrc
在这里不是一个合适的解决方案
您可以使用Maven publish插件将插件发布到本地Maven存储库。然后像任何其他工件一样简单地消耗它。
假设你的插件项目中有类似的东西:
plugins {
`maven-publish`
`java-gradle-plugin`
}
只需在本地发布即可:
./gradlew :my-plugin-project:publishToMavenLocal
然后在你的消费项目中,比如:
buildscript {
repositories {
mavenLocal()
}
dependencies {
"classpath"("com.example:my-plugin-gav:1.0.0-SNAPSHOT")
}
}
// apply plugin