如何在多个范围内进行 sbt 任务 运行

How to make an sbt task run on under multiple scopes

我编写了一个生成一些源代码和资源的 sbt 插件。它被硬编码为在编译范围内工作。

我怎样才能让它在测试范围内工作,这样我就可以在 运行ning 测试时使用插件,它会查找并输出到正确的文件夹?

例如,在代码的各个点中,我提到了与 src/main/resources 相关的 resourceManaged in Compile,但是当 test 是 运行 时,我希望它是resourceManaged in Test 当与 src/test/resources 相关时。

如何抽象出作用域?

这是 Plugins Best Practices, specifically in the Configuration advices 部分中讨论的主题。

提供原始设置和配置的设置

如果您的插件是 ObfuscatePlugin,请提供 baseObfuscateSettings 不在任何配置范围内的插件:

lazy val baseObfuscateSettings: Seq[Def.Setting[_]] = Seq(
  obfuscate := Obfuscate((sources in obfuscate).value),
  sources in obfuscate := sources.value
)

正如您在上面看到的,它正在访问 sources 密钥,但未指定哪个配置的来源。

在配置中

override lazy val projectSettings = inConfig(Compile)(baseObfuscateSettings)

inConfig 将传入的设置序列限定在特定配置中。如果你想开箱即用地支持 CompileTest,你可以说:

override lazy val projectSettings =
  inConfig(Compile)(baseObfuscateSettings) ++
  inConfig(Test)(baseObfuscateSettings)