首页 > 解决方案 > 如何创建我自己的项目可以依赖的自定义 scalafmt 样式?

问题描述

我有一堆 scala 项目。他们应该共享一个共同的代码风格。我正在使用 scalafmt 来执行某些规则,但我必须创建一个

 .scalafmt.conf

对于每个项目。如果团队更改了 scalafmt 规则,我们必须为每个项目手动更改它。因此,这些文件很容易自行演变。

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

Scalafmt 支持默认样式,例如:

 style = default

或者

 style  = defaultWithAlign

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

style = MyCompanyDefault

标签: scalascalafmt

解决方案


考虑定义一个自定义任务以从远程存储库下载 .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任务依赖于 remoteProtoFiles这样的任务

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

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

我们可以创建一个 sbt 自动插件来分发给每个项目:

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并启用 via将在执行后enablePlugins(ScalafmtRemoteConfigPlugin)自动下载。.scalafmtsbt compile


推荐阅读