Как создать свой собственный стиль scalafmt, от которого могут зависеть мои проекты? - PullRequest
3 голосов
/ 17 июня 2019

У меня есть куча проектов Scala. Они должны иметь общий стиль кода. Я использую scalafmt для обеспечения соблюдения определенных правил, но мне нужно создать

 .scalafmt.conf

для каждого проекта. Если команда изменит правила scalafmt, нам придется изменить его для каждого проекта вручную. Таким образом, файлы могут развиваться самостоятельно.

Как я могу создать общий scalafmt.conf как свою собственную зависимость, которую может импортировать другой проект? Таким образом, проект все еще может зависеть от собственной версии стиля кода, но путь обновления намного проще и должен содержать только обновление зависимости.

Scalafmt поддерживает стили по умолчанию, такие как:

 style = default

или

 style  = defaultWithAlign

Я в основном ищу способ определить свой собственный стиль и ссылаться на него в своих проектах:

style = MyCompanyDefault

1 Ответ

3 голосов
/ 17 июня 2019

Рассмотрите возможность определения пользовательской задачи для загрузки .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.

...