编写一个可以发布的buildSrc Gradle插件

Jon*_*son 8 plugins gradle

我正在为我的公司编写一个自定义 Gradle 插件,以协助我们产品的集成测试。我的团队希望在主产品构建中构建和使用插件(就像“buildSrc”插件一样),但也需要将插件作为工件发布,供其他团队与我们的产品集成使用。

如果我尝试将它作为独立插件包含在settings.gradle文件中,然后将它作为依赖项包含在 buildscript 中,它显然不起作用,因为首先解释 buildscript 块。

我还尝试从构建脚本中运行另一个构建,如下所示:

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'
  }
}
Run Code Online (Sandbox Code Playgroud)

这会导致插件被构建并放置在本地 Maven 存储库中,但随后初始 Gradle 构建直接失败,因为它无法解析新构建的存档。如果我再次运行它,它会起作用。我不明白这种行为。

我可能会用这种方法陷入困境。有没有办法以一种不那么“hacky”的方式来完成这项工作?

Jon*_*son 2

我发现了一种奇怪的方法来实现这一点:将插件符号链接到 buildSrc(至少在 *nix 上)。


项目目录

project/
  buildSrc/ -> gradle_plugins/
  gradle_plugins/
    pluginA/
    pluginB/
    ...
    build.gradle
    settings.gradle
  ...
  build.gradle
  settings.gradle
Run Code Online (Sandbox Code Playgroud)

项目/设置.gradle

include 'gradle_plugins:pluginA'
include 'gradle_plugins:pluginB'
...
Run Code Online (Sandbox Code Playgroud)

项目/gradle_plugins/settings.gradle

include 'pluginA'
include 'pluginB'
...
Run Code Online (Sandbox Code Playgroud)

项目/gradle_plugins/build.gradle

...
rootProject.dependencies {
    runtime project(path)
}
...
Run Code Online (Sandbox Code Playgroud)