如何在 Gradle 插件中设置任务属性

How do I set task properties in a Gradle Plugin

我正在创建一个 gradle 插件来应用 sonar-runner 插件并默认许多值,例如声纳主机 URL 和声纳 JDBC URL.我不知道如何设置属性。

当我在 build.gradle 中设置时,我使用:

apply plugin: 'sonar-runner'

sonarRunner {
    sonarProperties {
        property 'sonar.host.url', 'http://mySonar.company.com'
        property 'sonar.jdbc.url', 'jdbc:mysql://127.0.0.1:1234/sonar'
    }
}

我的 gradle 插件看起来像:

class MySonarPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.apply plugin: 'sonar-runner'
        project.configurations {
            sonarRunner {
                sonarProperties {
                    property 'sonar.host.url', 'http://mySonar.company.com'
                    property 'sonar.jdbc.url', 'jdbc:mysql://127.0.0.1:1234/sonar'
                }
            }
        }
    }
}

使用此设置,我得到一个 No signature of method 异常。我应该如何设置这些属性?

我发现我可以使用 project.getExtensions().sonarRunner.sonarProperties{ ... } 来设置声纳属性。请参阅下面的示例。

class MySonarPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.apply plugin:'sonar-runner'
        project.getExtensions().sonarRunner.sonarProperties {
            property 'sonar.host.url', 'http://mySonar.company.com'
            property 'sonar.jdbc.url', 'jdbc:mysql://127.0.0.1:1234/sonar'
        }
    }
}

谢谢@mikerylander 和@ravikanth!我也尝试过 setProperty 和 .properties 解决方案,但它们对我不起作用。

真正棘手的事情是自动完成没有为我找到 project.getExtensions().sonarqube.properties 的 "sonarqube" 部分,所以如果没有你的 post,我从来没有找到这个解决方案。

我为多模块 Android 项目为 运行 sonarqube 编写了自定义 Gradle 插件,您的 post 帮助了我。下面是我的完整自定义插件。由于该插件旨在包含在我的 Android 项目的任何子模块的 build.gradle 中,因此我在前面添加了 "my_product" ${project.path} 但当然您可以在此处使用任何值.

这是我的完整插件代码,希望对您有所帮助:

package com.example.gradle.plugins

import org.gradle.api.Plugin
import org.gradle.api.Project

class MySonarCodeCoveragePlugin implements Plugin<Project> {
    private Project project

    void apply(Project project) {
        this.project = project

        project.apply plugin: 'org.sonarqube'

        project.getExtensions().sonarqube.properties
                {
                    property "sonar.sources", "${project.projectDir}/src/main"
                    property "sonar.organization", "my_org"
                    property "sonar.projectKey", "my_product${project.path}"
                    property "sonar.projectName", "my_product${project.path}"
                    property "sonar.coverage.jacoco.xmlReportPaths", "${project.buildDir}/reports/jacoco/jacocoTestReport/jacocoTestReport.xml"
                    property "sonar.scanner.metadataFilePath", "${project.buildDir}/sonar/report-task.txt"
                }
    }
}