gpt4 book ai didi

scala - 如何以 DRY 方式过滤/禁用 SBT 中所有子项目的 scalac 选项

转载 作者:行者123 更新时间:2023-12-04 15:26:40 26 4
gpt4 key购买 nike

我的项目有多个子项目,我使用 sbt-tpolecat 1在这个项目中。
我在我的代码中使用了 Java 框架。这个框架大量使用流畅的接口(interface),所以我需要在我的代码中抑制许多“丢弃的非单位值”警告。

sbt-tpolecat提供了很多开箱即用的有用 scalac 选项,我只想排除 -Wvalue-discard我的用例的 scalac 选项。

问题是我有 4-5 个子项目 2在这个项目中。现在我需要将以下内容添加到每个子项目的 settings 中:

sub_project_name.settings(
scalacOptions ~= (_.filterNot(Set("-Wvalue-discard")))
)
// or
sub_project_name.settings(valueDiscardSetting)

lazy val valueDiscardSetting =
Seq(scalacOptions ~= (_.filterNot(Set("-Wvalue-discard"))))


有没有办法以 DRY 方式在所有子项目中排除此选项?
我当前的子项目层次结构类似于:
App -> Frontend -> Common
-> Backend -> Common

最佳答案

常用设置值

常见的做法是factoring out common settings在多项目构建中

define a sequence of common settings in a val and add them to each project. Less concepts to learn that way.



例如
lazy val commonSettings = Seq(
scalacOptions ~= (_.filterNot(Set("-Wvalue-discard"))),
...
)

lazy val util = (project in file("util")).settings(commonSettings)
lazy val core = (project in file("core")).settings(commonSettings)

常用设置自动插件

Auto plugins可以为每个项目设置设置。在 project/CommonSettingsPlugin.scala下创建如下小插件
object CommonSettingsPlugin extends AutoPlugin {
override def requires = plugins.JvmPlugin
override def trigger = allRequirements
override lazy val projectSettings = Seq(
scalacOptions ~= (_.filterNot(Set("-Wvalue-discard")))
)
}

覆盖
override def requires = plugins.JvmPlugin

应该有效地启用插件而无需显式调用 enablePluginbuild.sbt .

使用 onLoad 覆盖设置
onLoad在所有项目构建和加载后最后发生。
lazy val settingsAlreadyOverridden = SettingKey[Boolean]("settingsAlreadyOverridden","Has overrideSettings command already run?")
settingsAlreadyOverridden := false
commands += Command.command("removeScalacOptions") { state =>
if (settingsAlreadyOverridden.value) {
state
} else {
Project.extract(state).appendWithSession(
Seq(
settingsAlreadyOverridden := true,
scalacOptions ~= (_.filterNot(Set("-Wvalue-discard")))
),
state
)
}
}

onLoad in Global := (onLoad in Global).value andThen ("removeScalacOptions" :: _)

还要考虑他们如何通过 removeScalacOptions 解决社区 build 中的问题.

关于scala - 如何以 DRY 方式过滤/禁用 SBT 中所有子项目的 scalac 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62111499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com