scala - 如何创建我自己的项目可以依赖的自定义 scalafmt 样式?
问题描述
我有一堆 scala 项目。他们应该共享一个共同的代码风格。我正在使用 scalafmt 来执行某些规则,但我必须创建一个
.scalafmt.conf
对于每个项目。如果团队更改了 scalafmt 规则,我们必须为每个项目手动更改它。因此,这些文件很容易自行演变。
如何创建一个公共scalafmt.conf
作为我自己的依赖项,其他项目可以导入?这样,一个项目仍然可以依赖于他们自己的代码样式版本——但升级路径更加直接,并且应该只包含升级依赖项。
Scalafmt 支持默认样式,例如:
style = default
或者
style = defaultWithAlign
我基本上是在寻找一种方法来定义我自己的风格并在我的项目中引用它:
style = MyCompanyDefault
解决方案
考虑定义一个自定义任务以从远程存储库下载 .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)
自动下载。.scalafmt
sbt compile
推荐阅读
- flutter - 如何在颤振中创建透明的底部导航栏?尝试了很多方法,但没有任何效果
- python - pygithub提交改进
- api - 使用 Azure AD B2C 的 Xamarin 表单在调用 Web api 时获得 401 Unauthorized
- android - Android - 布局在显示警报对话框时重置 | Alertdialog 重新设置自定义列表视图的视图
- typescript - Vue js 3 - 类型“CreateComponentPublicInstance<{}、{}、{}、{}、{} 上不存在属性“项目”,
- python - 返回字符串无穷次
- asp.net-mvc - 如何创建本地 SQLite 数据库并一起发布到 IIS?(ASP.NET MVC)
- webview - 从浏览器运行我的 VodaPay 小程序 web-view 应用程序时,我无法访问我的图书馆
- php - 转换链接时TCPDF MultiCell ishtml错误,只有第一个可点击
- json - 颤振错误:列表
不是 Map 类型的子类型