Scala代码检查
引言
通常我们用Sonar做代码检查,本文将阐述如何使用sonar做sbt scala工程的代码检查。
Sonar安装
起先我从官网下载Sonar安装,发现有很多版本,而且有元数据库的依赖(新版本不支持Mysql),其中自带的elasticsearch也遇到问题(不能在root账户下启动),花了半天时间才安装好,很费事。
建议Docker安装,sonar-scala-docker有比较详细的说明。大致步骤:
docker pull mwizner/sonarqube-scala-plugins:5.5.0-full
//这一步需要点时间
docker run -p 80:9000 mwizner/sonarqube-scala-plugins:latest-full
启动好后打开http://localhost。
admin登录后创建一个自己的工程,例如下边用到的 datasync。
Sbt-Sonar
通常我们使用Idea开发,这里我们不必去安装Sonarlink-plugin,参考scala-sonar,github地址,样例地址(包含了单项目的和多项目的样例)。
大致步骤:
-
plugins.sbt中加入plugin
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.6.1") addSbtPlugin("com.github.mwz" % "sbt-sonar" % "2.2.0") //可以不加scapegoat,不过它更丰富的代码检查Case addSbtPlugin("com.sksamuel.scapegoat" % "sbt-scapegoat" % "1.1.0")
-
build.sbt中加入配置
// 以一个带有子工程的为例 import sbtsonar.SonarPlugin.autoImport.sonarProperties scapegoatVersion in ThisBuild := "1.3.9" lazy val sonarSettings = Seq(sonarProperties ++= Map( "sonar.projectName" -> "datasync",//和在sonar上定义的project名称一致 "sonar.modules" -> "datasync-api,datasync-model,datasync-service",//根据子工程而定 "datasync-api.sonar.projectName" -> "api", "datasync-model.sonar.projectName" -> "model", "datasync-service.sonar.projectName" -> "service", "sonar.projectKey" -> "datasync", "sonar.sources" -> "src/main/scala", "sonar.java.binaries"->"target/scala-2.12",//一般需要指定,有可能会有部分Java代码 "sonar.tests" -> "src/test/scala", "sonar.junit.reportPaths" -> "target/test-reports", "sonar.sourceEncoding" -> "UTF-8", "sonar.scala.scoverage.reportPath" -> "target/scala-2.12/scoverage-report/scoverage.xml", "sonar.scala.scapegoat.reportPath" -> "target/scala-2.12/scapegoat-report/scapegoat.xml" )) // 前提是增加了Scapegoat plugin // 如果不想代码分析时因为Error失败,则添加下边配置调整级别 // 经过验证这个配置放在父工程中的build.sbt上不全局生效,也不能加in ThisBuild,遇到error还是会失败。如果明确需要指定的子工程调整级别,则在对应子工程build.sbt上添加。 scalacOptions in Scapegoat += "-P:scapegoat:overrideLevels:TraversableHead=Warning:OptionGet=Warning"
Scapegoat详细的规则描述可以参考Github。
-
运行代码分析
sbt -Dsonar.host.url=http://localhost clean coverage coverageReport scapegoat sonarScan
-
界面查看
登录http://localhost。