编写可以发布的buildSrc Gradle插件

时间:2014-09-10 19:15:33

标签: plugins gradle

我正在为我的公司编写自定义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”的工作。方式是什么?

2 个答案:

答案 0 :(得分:2)

我发现了一种实现此目的的hacky方法:将插件符号链接到buildSrc(至少在* nix上)。


项目目录

project/
  buildSrc/ -> gradle_plugins/
  gradle_plugins/
    pluginA/
    pluginB/
    ...
    build.gradle
    settings.gradle
  ...
  build.gradle
  settings.gradle

项目/ settings.gradle

include 'gradle_plugins:pluginA'
include 'gradle_plugins:pluginB'
...

项目/ gradle_plugins / settings.gradle

include 'pluginA'
include 'pluginB'
...

项目/ gradle_plugins /的build.gradle

...
rootProject.dependencies {
    runtime project(path)
}
...

答案 1 :(得分:0)

我解决这个问题的方法如下:

使用buildSrc/myPlugin/..进行常规多项目构建在我的构建过程中,我调用./gradlew -b buildSrc/myPlugin/build.gradle uploadArchives(或者您用来发布maven工件的任务)。

由于"official" hack必须将gradle插件添加到根项目的运行时依赖项,因此此步骤将失败。所以我用try catch包围它。我觉得这不完美,但似乎有效。