#scala #sbt #scalariform
#scala #sbt #scalariform
Вопрос:
Плагин SBT scalariform форматирует файлы более одного раза при настройке нескольких проектов. Вот пример https://github.com/Seetaramayya/sbt-scalariform-example
если вы скомпилируете проект, вы можете увидеть что-то вроде этого в консоли
[info] Formatting 5 Scala sources ProjectRef(uri("file:/Users/seeta/projects/github/sbt-multi-scalariform/example/"), "root")(compile) ...
[info] Formatting 7 Scala sources ProjectRef(uri("file:/Users/seeta/projects/github/sbt-multi-scalariform/example/"), "module1")(compile) ...
[info] Formatting 7 Scala sources ProjectRef(uri("file:/Users/seeta/projects/github/sbt-multi-scalariform/example/"), "module2")(compile) ...
[info] Formatting 7 Scala sources ProjectRef(uri("file:/Users/seeta/projects/github/sbt-multi-scalariform/example/"), "main")(compile) ...
В базе кода имеется 5 файлов scala и 2 файла sbt. Ни в SBT, ни в документации scalariform я не смог найти, как выполнить задачу только один раз в многомодульной настройке.
Я хотел бы выполнить задачу только один раз. Единственный вариант, который я вижу, это включить плагин на уровне корневого проекта и отключить в подпроектах, но мне не понравился этот вариант (мне нужно добавить disablePlugins
в 15
подпроекты)
Ответ №1:
Проблема, похоже, в том, что
scalariformFormat
Задача каждого подпроекта в разных областях имеет корень проекта в своихsourceDirectories
настройках. Это просто приводит к тому, что весь проект сканируется для поиска источников scala и форматируется столько раз, сколько существует подпроектов.
и было устранено с помощью scalariformWithBaseDirectory
настройки
val scalariformWithBaseDirectory = settingKey[Boolean]("Whether or not to format sources in project root (default: false)")
Таким образом, настройка withBaseDirectory=false
.scalariform.conf
должна давать результат
[info] Formatting 1 Scala source ProjectRef(uri("file:/Users/mario_galic/code/stackoverflow/sbt-scalariform-example/"), "main")(compile) ...
[info] Formatting 1 Scala source ProjectRef(uri("file:/Users/mario_galic/code/stackoverflow/sbt-scalariform-example/"), "module1")(compile) ...
[info] Formatting 1 Scala source ProjectRef(uri("file:/Users/mario_galic/code/stackoverflow/sbt-scalariform-example/"), "module2")(compile) ...
Однако обратите внимание, что это не приведет к форматированию *.scala
источников в корневом project/
каталоге. Для решения этой проблемы мы могли бы попытаться сохранить withBaseDirectory=false
, .conf
но включить его для корневого проекта следующим образом
lazy val root = (project in file("."))
.aggregate(module1, module2, main)
.settings(scalariformWithBaseDirectory := true)
какие результаты
[info] Formatting 1 Scala source ProjectRef(uri("file:/Users/mario_galic/code/stackoverflow/sbt-scalariform-example/"), "module2")(compile) ...
[info] Formatting 1 Scala source ProjectRef(uri("file:/Users/mario_galic/code/stackoverflow/sbt-scalariform-example/"), "module1")(compile) ...
[info] Formatting 1 Scala source ProjectRef(uri("file:/Users/mario_galic/code/stackoverflow/sbt-scalariform-example/"), "main")(compile) ...
[info] Formatting 5 Scala sources ProjectRef(uri("file:/Users/mario_galic/code/stackoverflow/sbt-scalariform-example/"), "root")(compile) ...
где мы все еще получаем дублирование, но не так сильно, как изначально.