我们可以在 Gradle buildSrc 中定义多个插件 class

Can we define more than a single Plugin class in a Gradle buildSrc

我有一个非常典型的 Gradle 库项目,其中包含一组依赖于某些通用配置的模块(Android 或纯 Java)。

这个通用配置被抽象成一个 "publishConfig.gradle" 文件(在那些需要它的 build.gradle 文件中通过 apply 读取)和一些在 buildSrc 中捕获的自定义任务。这个问题是关于后者的。

buildSrc 是一个单独的 module/project,由特定包中的源代码(如 Groovy)组成,作为一个 Groovy 文件,有两个 classes:class 实现 Plugin 和插件扩展 class。 例如:

org.clvrmnky.gradle.plugins.LibraryPlugin

此配置和定义的任务正常运行。没问题。

现在我出于不同的原因想添加额外的自定义任务(请记住,这是共享自定义配置的一部分,用于根项目中越来越多的子模块)所以我添加了一个并行 class定义新插件 class 实现 Plugin 的文件。 例如:

org.clvrmnky.gradle.plugins.BuildBreaker

作为参考,这里是 class 和任务定义片段:

[...]
public class BuildBreaker implements Plugin<Project> {
    static def authString = fetchSonarAuthString()

    @Override
    void apply(Project project) {
        project.extensions.create("buildbreaker", BuildBreakerExtension)

        project.task([
            description: 'Fail this task if the Sonarqube Quality Gate does not pass.',
            dependsOn: ["sonarqube"]
        ], 'breakOnBadQualityGate') {
[...]

也就是说,class 和任务方法的定义相似,但具有不同的字符串标识符。

但是,当我这样做时,我定义的新任务对根项目或项目的任何子模块都不可见:

PS C:\rd\SOPLibs\Commons> .\gradlew.bat  breakOnBadQualityGate
:buildSrc:compileJava UP-TO-DATE
:buildSrc:compileGroovy UP-TO-DATE
[...]    
FAILURE: Build failed with an exception.

* What went wrong:
Task 'breakOnBadQualityGate' not found in root project 'Commons'.

* Try:
Run gradlew tasks to get a list of available tasks. Run with --stacktrace option
 to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

build 目录包含所有源代码的 classes,并且有一个包含这些 classes 的库 jar,我 推测 [=52] =] 在运行时被提供给 Gradle class 路径。也就是说,这是构建和打包没有错误。

我看到提示您需要在多项目 buildSrc 项目上调整 buildSrc build.gradle 以便所有 jar 在运行时都在 class 路径上,但在这种情况下我们有一个包含多个插件任务的 jarfile。

我也试过将 BuildBreaker class 移到一个单独的包中,但这并没有解决问题。

我们不能在单个 buildSrc 中实现多个 Plugin class,即使它们具有不同的 class 名称?还是我必须将它们拆分成多个 buildSrc 项目?

您可以在 buildSrc 中定义任意数量的插件和任务。但是在你

之前什么都不会生效
 apply plugin: foo.bar.MyPlugin

或者

task foo(type: com.foo.MyTask) {...}