你可能會(huì)想使用新的 Sonar Runner 插件來(lái)代替現(xiàn)在這個(gè)插件。尤其是因?yàn)橹挥?Sonar Runner 插件支持 Sonar 3.4 及更高的版本。
Sonar 插件提供了對(duì) Sonar,一個(gè)基于 web 的代碼質(zhì)量監(jiān)測(cè)平臺(tái)的集成。該插件添加了sonarAnalyze task ,用來(lái)分析一個(gè) project 及子 project 都應(yīng)用了哪個(gè)插件。分析結(jié)果存儲(chǔ)于 Sonar 數(shù)據(jù)庫(kù)中。該插件基于 Sonar Runner,并要求是 Sonar 2.11 或更高的版本。
SonarAnalyze task 是一項(xiàng)需要顯式執(zhí)行的獨(dú)立任務(wù),不依賴于任何其他 task。除了源代碼之外,該 task 還分析了類文件和測(cè)試結(jié)果文件(如果有)。為獲得最佳結(jié)果,建議在分析前運(yùn)行一次完整的構(gòu)建。在典型的設(shè)置中,會(huì)每天在構(gòu)建服務(wù)器上運(yùn)行一次分析。
最低要求是必須配置 Sonar 插件應(yīng)用于該 project。
配置使用 Sonar 插件
build.gradle
apply plugin: "sonar"
除非 Sonar 是在本地上運(yùn)行,并且有默認(rèn)的配置,否則有必要配置 Sonar 服務(wù)器及數(shù)據(jù)庫(kù)的連接設(shè)置。
配置 Sonar 連接設(shè)置
build.gradle
sonar
server {
url = "http://my.server.com"
}
database {
url = "jdbc:mysql://my.server.com/sonar"
driverClassName = "com.mysql.jdbc.Driver"
username = "Fred Flintstone"
password = "very clever"
}
}
或者,可以從命令行設(shè)置某些或全部的連接設(shè)置。
Project 設(shè)置會(huì)決定這個(gè)項(xiàng)目將如何進(jìn)行分析。默認(rèn)配置非常適合于分析標(biāo)準(zhǔn) Java 項(xiàng)目,并可以在許多方面進(jìn)行自定義。
配置 Sonar project 設(shè)置
build.gradle
sonar
project
coberturaReportPath = file("$buildDir/cobertura.xml")
}
}
在上面的例子中,sonar,server,database 和 project 塊分別配置的是SonarRootModel, SonarServer, SonarDatabase 及 SonarProject 類型的對(duì)象??梢圆殚喫鼈兊?API 文檔以了解更多信息。
Sonar 插件能夠一次分析整個(gè)項(xiàng)目的層次結(jié)構(gòu)。它能夠在 Sonar 的 web 界面生成一個(gè)層次圖,該層次圖包含了綜合的指標(biāo)且能夠深入到子項(xiàng)目中。同時(shí),它比單獨(dú)分析每個(gè)項(xiàng)目更快。
要分析項(xiàng)目的層次結(jié)構(gòu), 需要把 Sonar 插件應(yīng)用于層次結(jié)構(gòu)的最頂層項(xiàng)目。通常(但不是一定)會(huì)是根項(xiàng)目。在該 project 中的 sonar 塊配置的是一個(gè) SonarRootModel 類型的對(duì)象。它擁有所有全局配置,最重要的服務(wù)器和數(shù)據(jù)庫(kù)的連接設(shè)置。
在多項(xiàng)目構(gòu)建中的全局配置
build.gradle
apply plugin: "sonar"
sonar {
server {
url = "http://my.server.com"
}
database {
url = "jdbc:mysql://my.server.com/sonar"
driverClassName = "com.mysql.jdbc.Driver"
username = "Fred Flintstone"
password = "very clever"
}
}
層次結(jié)構(gòu)中的每個(gè)項(xiàng)目都有其自身的項(xiàng)目配置。共同的值可以在父構(gòu)建腳本中進(jìn)行設(shè)置。
多項(xiàng)目構(gòu)建中的共同項(xiàng)目配置
build.gradle
subprojects {
sonar
project
sourceEncoding = "UTF-8"
}
}
}
在子項(xiàng)目中的 sonar 塊配置的是一個(gè) SonarProjectModel 類型的對(duì)象。
這些 Projects 也可以單獨(dú)配置。例如,設(shè)置 skip 屬性為 true 以防止一個(gè)項(xiàng)目(和它的子項(xiàng)目)被分析。跳過(guò)的項(xiàng)目將不會(huì)顯示在 Sonar 的 web 界面中。
多項(xiàng)目構(gòu)建中的單獨(dú)項(xiàng)目配置
build.gradle
project
sonar
project
skip = true
}
}
}
另一種典型的各個(gè)項(xiàng)目配置是配置要分析的編程語(yǔ)言。注意,Sonar 只能分析每個(gè)項(xiàng)目的一種語(yǔ)言。
配置語(yǔ)言分析
build.gradle
project
sonar
project
language = "groovy"
}
}
}
當(dāng)一次只設(shè)置一個(gè)屬性時(shí),等效屬性的語(yǔ)法更加簡(jiǎn)潔:
使用屬性語(yǔ)法
build.gradle
project(":project2").sonar.project.language = "groovy"
默認(rèn)情況下,Sonar 插件將分析 main source set 里的生產(chǎn)源文件,以及 test source sets 里的測(cè)試源文件。它的分析獨(dú)立于項(xiàng)目的源目錄布局。根據(jù)需要,可以添加額外的 source sets。
分析自定義的 Source Sets
build.gradle
sonar.project {
sourceDirs += sourceSets.custom.allSource.srcDirs
testDirs += sourceSets.integTest.allSource.srcDirs
}
要分析非 Java 語(yǔ)言編寫的代碼,請(qǐng)安裝相應(yīng)的 Sonar 插件,并相應(yīng)地設(shè)置 sonar.project.language :
分析非 Java 語(yǔ)言
build.gradle
sonar.project {
language = "grvy" // set language to Groovy
}
截至 Sonar 3.4,每個(gè)項(xiàng)目只可以分析一種語(yǔ)言。不過(guò),在多項(xiàng)目構(gòu)建中你可以為不同的項(xiàng)目設(shè)置不同的語(yǔ)言。
最終,大多數(shù)配置都會(huì)以被稱為 Sonar 屬性的鍵-值對(duì)的形式傳遞給 Sonar 的代碼分析器。在 API 文檔中的 SonarProperty 注解顯示了插件的對(duì)象模型的屬性是如何映射到相應(yīng)的 Sonar 屬性中的。Sonar 插件提供了 hooks,用于 Sonar 屬性傳給代碼分析器前的后置處理。相同的 hook 可以用來(lái)添加額外的屬性,并且不會(huì)被插件的對(duì)象模型所覆蓋。
對(duì)于全局的 Sonar 屬性,可以使用 SonarRootModel 上的 withGlobalProperties hook:
設(shè)置自定義的全局屬性
build.gradle
sonar.withGlobalProperties { props ->
props["some.global.property"] = "some value"
// non-String values are automatically converted to Strings
props["other.global.property"] = ["foo", "bar", "baz"]
}
對(duì)于每個(gè)項(xiàng)目的 Sonar 屬性,使用 SonarProject 上的 withProjectProperties hook:
設(shè)置自定義的項(xiàng)目屬性
build.gradle
sonar.project.withProjectProperties { props ->
props["some.project.property"] = "some value"
// non-String values are automatically converted to Strings
props["other.global.property"] = ["foo", "bar", "baz"]
}
Sonar 的可用屬性的列表可以在 Sonar 文檔中找到。注意,對(duì)于大多數(shù)的這些屬性,Sonar 插件的對(duì)象模型具有等效的屬性,且沒(méi)有必要使用 withGlobalProperties 或withProjectProperties 的 hook。對(duì)于第三方 Sonar 插件的配置,請(qǐng)參閱插件的文檔。
下面的屬性或者可以從命令行中或者是作為 sonarAnalyze 任務(wù)的任務(wù)參數(shù)這兩種方式之一來(lái)設(shè)置。任務(wù)參數(shù)將覆蓋任何在構(gòu)建腳本中設(shè)置的相應(yīng)值。
下面是一個(gè)完整的例子:
gradle sonarAnalyze --server.url=http://sonar.mycompany.com --database.password=myPassword --verbose
如果你需要從命令行設(shè)置其他屬性,你可以使用系統(tǒng)屬性來(lái)做:
實(shí)現(xiàn)自定義命令行屬性
build.gradle
sonar.project {
language = System.getProperty("sonar.language", "java")
}
然而,請(qǐng)記住,通常最好是配置在構(gòu)建腳本中,并在代碼控制下。
Sonar 插件向 project 中添加了以下任務(wù)。
表 35.1. 聲納插件 - 任務(wù)
任務(wù)名稱 | 依賴于 | 類型 | 描述 |
sonarAnalyze
|
- | sonarAnalyze | 分析項(xiàng)目層次結(jié)構(gòu),并將結(jié)果存儲(chǔ)在 Sonar 數(shù)據(jù)庫(kù)。 |
更多建議: