我有一个非常典型的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项目吗?
答案 0 :(得分:0)
您可以在buildSrc
中定义任意数量的插件和任务。但是直到你才会生效。
apply plugin: foo.bar.MyPlugin
或者
task foo(type: com.foo.MyTask) {...}