Как создать свой собственный стиль scalafmt, от которого могут зависеть мои проекты?
У меня есть куча проектов Scala. Они должны иметь общий стиль кода. Я использую scalafmt для обеспечения соблюдения определенных правил, но я должен создать
.scalafmt.conf
для каждого проекта. Если команда изменит правила scalafmt, нам придется изменить его для каждого проекта вручную. Таким образом, файлы склонны развиваться самостоятельно.
Как я могу создать общий scalafmt.conf
как моя собственная зависимость, которую может импортировать другой проект? Таким образом, проект может по-прежнему зависеть от собственной версии стиля кода, но путь обновления намного проще и должен содержать только обновление зависимости.
Scalafmt поддерживает стили по умолчанию, такие как:
style = default
или же
style = defaultWithAlign
Я в основном ищу способ определить свой собственный стиль и ссылаться на него в своих проектах:
style = MyCompanyDefault
1 ответ
Попробуйте определить пользовательскую задачу для загрузки .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 auto для распространения в каждом проекте:
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
,