Gradle:使用同级子项目作为插件



我有一个包含两个子对象的项目:gradle-pluginplugin-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'

这是有效的,但感觉像是一个巨大的黑客攻击,并导致"自举问题"。

例如,我不能cleangradle-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

最新更新