Как создать свой собственный стиль 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,

Другие вопросы по тегам