我们可以在Gradle buildSrc中定义多个Plugin类吗?

时间:2017-02-08 15:41:33

标签: gradle gradle-plugin

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

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

buildSrc是一个单独的模块/项目,由特定包中的源(作为Groovy)组成,作为具有两个类的单个Groovy文件:实现Plugin的类和插件扩展类。 e.g

org.clvrmnky.gradle.plugins.LibraryPlugin

此配置和定义的任务无误地运行。没问题。

现在我想出于其他原因添加其他自定义任务(请记住,这是对根项目越来越多的子模块的共享自定义配置的所有部分)所以我添加了一个定义新插件的并行类文件实现Plugin的类。 e.g

org.clvrmnky.gradle.plugins.BuildBreaker

供参考,这是类和任务定义片段:

[...]
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') {
[...]

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

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

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目录包含所有源的类,并且有一个lib jar包含这些类,我推测在运行时被提供给Gradle类路径。也就是说,这是建筑和包装没有错误。

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

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

我们不能在单个buildSrc中实现多个Plugin类,即使它们具有不同的类名吗?或者我必须将它们分成多个buildSrc项目吗?

1 个答案:

答案 0 :(得分:0)

您可以在buildSrc中定义任意数量的插件和任务。但是直到你才会生效。

 apply plugin: foo.bar.MyPlugin

或者

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