我正在为我的公司编写自定义Gradle插件,以协助我们产品的集成测试。我的团队想要在主产品构建中构建插件并使用它(例如' buildSrc'插件),但也需要将插件作为工件发布,供其他团队用于集成与我们的产品。
如果我尝试将其作为独立插件包含在settings.gradle
文件中,然后将其作为依赖项包含在buildscript中,它显然不起作用,因为buildcript块首先被解释。
我也试过在buildcript中运行另一个构建,如下所示:
buildscript {
def connection = GradleConnector.newConnector()
.forProjectDirectory(file("${project.projectDir}/theplugin"))
.connect()
try {
connection.newBuild()
.forTasks('clean', 'build', 'install')
.run()
} finally {
connection.close()
}
repositories {
mavenLocal()
...
}
dependencies {
classpath 'com.company.product.gradle.theplugin'
}
}
这会导致插件被构建并放置在本地Maven仓库中,但之后的初始Gradle构建会立即失败,因为它无法解析新构建的存档。如果我再次运行它,它的工作原理。我不明白这种行为。
我可能会用这种方法走下兔子洞。有没有办法让这项工作和一个不那么“hacky”的工作。方式是什么?
答案 0 :(得分:2)
我发现了一种实现此目的的hacky方法:将插件符号链接到buildSrc(至少在* nix上)。
project/
buildSrc/ -> gradle_plugins/
gradle_plugins/
pluginA/
pluginB/
...
build.gradle
settings.gradle
...
build.gradle
settings.gradle
include 'gradle_plugins:pluginA'
include 'gradle_plugins:pluginB'
...
include 'pluginA'
include 'pluginB'
...
...
rootProject.dependencies {
runtime project(path)
}
...
答案 1 :(得分:0)
我解决这个问题的方法如下:
使用buildSrc/myPlugin/..
进行常规多项目构建在我的构建过程中,我调用./gradlew -b buildSrc/myPlugin/build.gradle uploadArchives
(或者您用来发布maven工件的任务)。
由于"official" hack必须将gradle插件添加到根项目的运行时依赖项,因此此步骤将失败。所以我用try catch包围它。我觉得这不完美,但似乎有效。