2017-07-06 89 views
0

我正在尝试创建2个任务来执行sonarcube任务。我希望能够指定取决于对于不同的任务,不能具有不同的系统属性值

task sonarqubePullRequest(type: Test){ 

     System.setProperty("sonar.projectName", "sonarqubePullRequest") 
     System.setProperty("sonar.projectKey", "sonarqubePullRequest") 
     System.setProperty("sonar.projectVersion", serviceVersion) 
     System.setProperty("sonar.jacoco.reportPath", 
     "${project.buildDir}/jacoco/test.exec") 

     tasks.sonarqube.execute() 
    } 


task sonarqubeFullScan(type: Test){ 
    System.setProperty("sonar.projectName", "sonarqubeFullScan") 
    System.setProperty("sonar.projectKey", "sonarqubeFullScan") 
    System.setProperty("sonar.projectVersion", serviceVersion) 
    System.setProperty("sonar.jacoco.reportPath", 
    "${project.buildDir}/jacoco/test.exec") 
    tasks.sonarqube.execute() 
} 

任务的工作任务,不同的性质,但似乎与我设置

如果我运行的第一个任务是sonarqubePullRequest那么性能的问题一切都很好,但如果运行sonarqubeFullScan,那么如果使用sonarqubePullRequest中指定的值。所以项目名称设置sonarqubePullRequest

它就好像这些属性是在运行时设置的并且无法更新。我觉得我错过了很明显的任何建议,大大收到。

回答

2

首先:NEVER use execute() on tasks。该方法不是公共Gradle API的一部分,因此它的行为可能会改变或不确定。 Gradle将自行执行任务,这可能是因为您指定了它们(命令行或settings.gradle)或任务依赖关系。

原因,为什么你的代码不起作用,是difference between the configuration phase and the execution phase。在配置阶段中,执行任务闭包中的所有(配置)代码,但不执行任务。所以,你总是会覆盖系统属性。只有(内部)任务操作doFirstdoLast关闭在执行阶段中执行。请注意,每个任务仅在构建中执行ONCE,因此您两次参数化任务的方法将无法执行。

此外,我不明白你为什么使用系统属性来配置你的sonarqube任务。你可以简单地通过直接配置任务:

sonarqube { 
    properties { 
     property 'sonar.projectName', 'sonarqubePullRequest' 
     // ... 
    } 
} 

现在,您可以配置sonarqube任务。为了区分你的两种情况,你可以为不同的属性值添加一个条件。接下来的示例使用项目属性的条件:

sonarqube { 
    properties { 
     // Same value for both cases 
     property 'sonar.projectVersion', serviceVersion 
     // Value based on condition 
     if (project.findProperty('fullScan') { 
      property 'sonar.projectName', 'sonarqubeFullScan' 
     } else { 
      property 'sonar.projectName', 'sonarqubePullRequest' 
     } 
    } 
} 

或者,您可以添加类型SonarQubeTask的另一项任务。通过这种方式,你可以以不同的参数化这两项任务,并呼吁他们(通过命令行或依赖),在需要的时候:

sonarqube { 
    // Generated by the plugin, parametrize like described above 
} 

task sonarqubeFull(type: org.sonarqube.gradle.SonarQubeTask) { 
    // Generated by your build script, parametrize in the same way 
} 
+0

伟大的答案,有一个问题我怎么在传递一个条件,如“全扫描”会是这样通过命令行'gradle sonarqube fullScan'? – JaChNo

+0

项目属性通过'-P = '来设置。因此,对于上面的代码示例,您可以指定'-PfullScan = true'。你也可以通过检查hasProperty('fullScan')来使用项目属性的存在性作为条件。在这种情况下,'-PfullScan'就足够了。 –

相关问题