scala - SBT scalariform 插件多次格式化同一内容,是否可以执行一次?

标签 scala sbt scalariform

SBT scalariform plugin在多项目设置中多次格式化文件。这是示例 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 文档中,我都找不到如何在多模块设置中仅执行一次任务。

我只想执行该任务一次。我看到的唯一选项是在根项目级别启用插件并在子项目中禁用,但我不喜欢这个选项(我需要在 15 子项目中添加 disablePlugins )

最佳答案

issue好像是这样的

Each subproject's scalariformFormat task in their different scopes have the project root in their sourceDirectories setting. This just leads to the whole project being crawled for scala sources and formatted as many times as there are subprojects.

并且已经addressed通过 scalariformWithBaseDirectory设置

val scalariformWithBaseDirectory = settingKey[Boolean]("Whether or not to format sources in project root (default: false)")

因此在 .scalariform.conf 中设置 withBaseDirectory=false 应该给出输出

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

但请注意,这不会格式化根 project/ 目录中的 *.scala 源。为了解决这个问题,我们可以尝试将 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) ...

我们仍然会遇到重复,但没有最初那么多。

关于scala - SBT scalariform 插件多次格式化同一内容,是否可以执行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55666023/

相关文章:

java - Play框架表单提交

scala - Scodec - Coproducts 找不到参数 auto 的隐式值 : scodec. codecs.CoproductBuilderAuto

scala - SBT:跨平台的方式来设置java.library.path吗?

scala - 如何使用 sbt 创建包含源(.java 和 .scala)和类的 .jar?

scala - 如何在 scala 中自动重新运行 sbt 项目

scala - 如何使用标量自动格式化 sbt 构建文件?

java - 地道的 Scala 列表理解 - 第一项匹配

scala - 如何在喷雾中从响应 'set-cookie' header 转换为请求 'cookie' header ?