我有很多scala项目。它们应共享通用的代码样式。我正在使用scalafmt强制执行某些规则,但必须创建
.scalafmt.conf
每个项目。如果团队更改了scalafmt规则,则必须为每个项目手动更改它。因此,文件易于自行发展。
如何创建公用scalafmt.conf
作为其他项目可以导入的我自己的依赖关系?这样,一个项目仍然可以依赖于他们自己的代码样式版本-但是升级路径更加直接,应该只包含升级依赖项。
Scalafmt支持默认样式,例如:
style = default
或
style = defaultWithAlign
我基本上是在寻找一种定义自己的样式并在我的项目中引用它的方式:
style = MyCompanyDefault
答案 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
。