如何创建自己的项目可以依赖的自定义scalafmt样式?

时间:2019-06-17 08:58:44

标签: scala scalafmt

我有很多scala项目。它们应共享通用的代码样式。我正在使用scalafmt强制执行某些规则,但必须创建

 .scalafmt.conf

每个项目。如果团队更改了scalafmt规则,则必须为每个项目手动更改它。因此,文件易于自行发展。

如何创建公用scalafmt.conf作为其他项目可以导入的我自己的依赖关系?这样,一个项目仍然可以依赖于他们自己的代码样式版本-但是升级路径更加直接,应该只包含升级依赖项。

Scalafmt支持默认样式,例如:

 style = default

 style  = defaultWithAlign

我基本上是在寻找一种定义自己的样式并在我的项目中引用它的方式:

style = MyCompanyDefault

1 个答案:

答案 0 :(得分:3)

考虑从远程存储库为download .scalafmt.conf定义自定义任务

lazy val remoteScalafmtConfig = taskKey[Unit]("Fetch .scalafmt from external repository")
remoteScalafmtConfig := {
  import scala.sys.process._
  streams.value.log.info("Downloading .scalafmt.conf config from remote repository")
  val remoteScalafmtFile = "https://some/external/repo/.scalafmt.conf"
  val baseDir = (Compile / baseDirectory).value
  url(s"$remoteScalafmtFile") #> (baseDir / ".scalafmt.conf") !
}

,然后像这样执行compile任务depend on remoteProtoFiles任务

compile in Compile := (compile in Compile).dependsOn(remoteScalafmtConfig).value

现在执行sbt compile应该在编译执行之前将.scalafmt.conf下载到项目的基本目录中。

我们可以create an sbt auto plugin分发到每个项目:

package example

import sbt._
import Keys._

object ScalafmtRemoteConfigPlugin extends AutoPlugin {
  object autoImport {
    lazy val remoteScalafmtConfig = taskKey[Unit]("Fetch .scalafmt from external repository")
  }

  import autoImport._
  override lazy val projectSettings = Seq(
    remoteScalafmtConfig := remoteScalafmtConfigImpl.value,
    compile in Compile := (compile in Compile).dependsOn(remoteScalafmtConfig).value
  )

  lazy val remoteScalafmtConfigImpl = Def.task {
    import scala.sys.process._
    streams.value.log.info("Downloading .scalafmt config from remote repository...")
    val remoteScalafmtFile = "https://github.com/guardian/tip/blob/master/.scalafmt.conf"
    val baseDir = (Compile / baseDirectory).value
    url(s"$remoteScalafmtFile") #> (baseDir / ".scalafmt.conf") !
  }
}

现在将插件导入project/plugins.sbt并通过enablePlugins(ScalafmtRemoteConfigPlugin)启用后,将在执行.scalafmt之后自动下载sbt compile