我正在尝试最近在gradle 1.5中发布的新Sonar Runner任务。我想做的是能够使声纳转轮任务依赖于另一个任务,这样我就可以为这个项目正确设置声纳属性(即sonar.sources,sonar.binaries,sonar.libraries,sonar.java.source ,sonar.java.target)。
具体来说,我正在使用一个名为bnd的osgi构建工具,它将在执行ant init任务时提供这些值(请注意,虽然我包含了默认的bnd build.xml文件,但我的完整构建实际上是使用gradle完成的)。
我以为我可以通过这样做来定制声纳转轮任务(这是一个多模块构建):
subprojects {
sonarRunner.dependsOn init
}
最后添加这样的东西(根据我对bnd ant变量的理解):
subprojects {
sonarRunner {
sonarProperties {
property "sonar.java.source", ant.property["project.sourcepath"]
property "sonar.java.target", ant.property["project.output"]
property "sonar.sources", ant.property["project.allsourcepath"]
property "sonar.libraries", ant.property["project.buildpath"]
}
}
sonarRunner.dependsOn init
}
不幸的是,当我尝试添加dependsOn时,我收到错误:
* What went wrong:
A problem occurred evaluating root project 'myproject'.
> Could not find property 'init' on project ':com.company.myproject.mymodule'.
如果我尝试使sonarRunner依赖于gradle任务,我会收到以下错误:
* What went wrong:
A problem occurred evaluating root project 'myproject'.
> Could not find method dependsOn() for arguments [task ':gradletask'] on org.gradle.api.sonar.runner.SonarRunnerExtension_Decorated@c4d7c0c.
我错过了一些明显的东西吗?如果有人能指出我正确的方向,那将是一个很大的帮助。
答案 0 :(得分:10)
无法在dependsOn()
任务上调用sonarRunner
的问题来自于插件同时定义sonarRunner
扩展和sonarRunner
任务的事实。看起来扩展优先于在gradle构建文件中按名称解析对象时的任务,因此您的堆栈跟踪指出您尝试在dependsOn()
的实例上调用org.gradle.api.sonar.runner.SonarRunnerExtension_Decorated
而不是在其上调用它一个SonarRunner
任务实例。
我认为如果您明确地从任务容器中检索了任务,那么您应该没问题:
tasks.sonarRunner.dependsOn init
答案 1 :(得分:5)
在子项目gradle文件之前评估根项目gradle文件,这意味着在您尝试解决它的位置上不存在init。
如果要在根项目中声明依赖项,则解决方法是使用after {http://www.gradle.org/docs/current/userguide/build_lifecycle.html中所述的afterEvaluate,尝试:
subprojects {
afterEvaluate{
sonarRunner.dependsOn init
}
}
另一个解决方案是直接在子项目中添加依赖项,或者应用另一个根gradle文件。
apply from: '../sonardependency.gradle'
答案 2 :(得分:1)
如果有人有兴趣,这是在Sonar中为每个子项目正确设置bnd信息的一种方法(我确信有更好的方法):
subprojects {
afterEvaluate {
sonarRunner {
sonarProperties {
ant.taskdef(resource:"aQute/bnd/ant/taskdef.properties",
classpath: "../cnf/plugins/biz.aQute.bnd/biz.aQute.bnd-2.0.0.jar");
def projectDir = project.rootDir.toString() + "/" + project.name;
ant.bndprepare(basedir:projectDir,print:"false",top:null);
def binaries = ant.properties['project.buildpath'].split(':') as ArrayList;
binaries.remove(0);
def binariesString = binaries.join(',');
properties["sonar.java.source"] = ant.properties['javac.source'];
properties["sonar.java.target"] = ant.properties['javac.target'];
properties["sonar.binaries"] = ant.properties['project.output'].replace(':',',');
properties["sonar.sources"] = ant.properties['project.sourcepath'].replace(':',',');
properties["sonar.libraries"] = binariesString;
}
}
}
}