Плагин SBT scalariform форматирует одно и то же несколько раз, возможно ли это сделать один раз?

#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) ...
 

где мы все еще получаем дублирование, но не так сильно, как изначально.