我的项目有多个子项目,在这个项目中我使用sbt-tpolecat
1。我在代码中使用Java框架。该框架大量使用流利的接口,因此我需要在代码中禁止显示许多“废弃的非单位值”警告。
这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
在多项目构建中有一种常见的做法会排除常见设置
在val中定义一系列常用设置,并将其添加到每个项目中。更少的概念需要学习。
例如
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)
自动插件可以为每个项目设置设置。在下面创建以下小插件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
要切实启用该插件,而无需显式调用enablePlugin
在build.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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句