2

我正在尝试最近在 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.

我在这里遗漏了一些明显的东西吗?如果有人能指出我正确的方向,那将是一个很大的帮助。

4

3 回答 3

10

您无法调用任务的问题dependsOn()来自sonarRunner插件定义了sonarRunner扩展和sonarRunner任务的事实。当对象在 gradle 构建文件中按名称解析时,扩展似乎优先于任务,因此您的堆栈跟踪指出您正在尝试调用dependsOn()实例org.gradle.api.sonar.runner.SonarRunnerExtension_Decorated而不是在SonarRunner任务实例上调用它。

我认为,如果您明确地从任务容器中检索任务,您应该没问题:

tasks.sonarRunner.dependsOn init
于 2013-04-07T17:07:06.767 回答
5

根项目 gradle 文件在子项目 gradle 文件之前被评估,这意味着 init 在您尝试解决它的位置不存在。

如果要在根项目中声明依赖项,一种解决方法是按照http://www.gradle.org/docs/current/userguide/build_lifecycle.html中的描述使用 afterEvaluate ,尝试:

subprojects {
    afterEvaluate{
        sonarRunner.dependsOn init
    }
}

另一种解决方案是直接或通过应用另一个根 gradle 文件在子项目中添加依赖项。

apply from: '../sonardependency.gradle'
于 2013-04-06T20:23:35.003 回答
1

如果有人感兴趣,这是在声纳中为每个子项目正确设置 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;
            }
        }
    }
}
于 2013-04-11T23:09:50.157 回答