使 Sonar Runner Gradle 任务依赖于我的一项任务

Posted

技术标签:

【中文标题】使 Sonar Runner Gradle 任务依赖于我的一项任务【英文标题】:Make The Sonar Runner Gradle Task Depend On One Of My Tasks 【发布时间】:2013-03-29 00:50:17 【问题描述】:

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

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

【问题讨论】:

在 Gradle 端声明源目录等可能会更好。在这种情况下,sonar-runner 插件将自动使用正确的值。请注意,Gradle 还通过其osgi 插件支持bnd IDE 集成更容易使用单独的文件来指定依赖项,无论是 ivy、maven 还是 bnd 文件(我在 bnd 文件中指定我的依赖项,允许我在 Eclipse 中使用 bndtools)。 gradle osgi 插件我相信和 bnd maven 插件类似——它只使用了 bnd 的 manifest 创建功能。 【参考方案1】:

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

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

tasks.sonarRunner.dependsOn init

【讨论】:

无论好坏,插件提供同名扩展和任务是一种常见模式。其他示例包括 IDE 和代码质量插件。 感谢您的信息!标记了。虽然它并没有解决我的问题。如果我在我的子项目块中添加它,我会得到“在任务集上找不到属性 'sonarRunner'。”。当我在我的***项目上运行它时,它会找到任务,但没有做我需要的事情(我真的希望它在为该子项目设置声纳属性之前运行子项目中的特定初始化任务)。 听起来您在应用sonar-runner 插件之前尝试添加任务依赖项。通常在任务执行时更改配置为时已晚,但由于 sonarRunner 块被延迟评估(根据文档),它可能适用于这种特殊情况。【参考方案2】:

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

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

subprojects 
    afterEvaluate
        sonarRunner.dependsOn init
    

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

apply from: '../sonardependency.gradle'

【讨论】:

当您解决了我的问题的第一部分(为什么找不到 init)时,我标记了您。谢谢!但是它并没有解决第二部分(“找不到dependsOn()的方法”)。 你回答了我的具体问题,所以我会给你。【参考方案3】:

如果有人有兴趣,这是在 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;
            
        
    

【讨论】:

您可以删除afterEvaluate,因为sonarRunner 块无论如何都会被延迟评估(根据文档)。

以上是关于使 Sonar Runner Gradle 任务依赖于我的一项任务的主要内容,如果未能解决你的问题,请参考以下文章

发现一sonar-runner bug

为多个 java 项目设置 sonar-runner

sonarqube安装好后,使用sonar-runner出错?

Sonar-Runner 2.4 找不到代码覆盖率报告

Sonar Runner 执行错误

使用 sonar-runner 自动为 sonarqube 新项目报告应用自定义权限模板