我开发了一个自定义 sbt 插件,它可以导入 sbt 本机打包程序,以及许多其他插件。这有助于引导一个 scala 项目,从而简化导入我们在整个项目中使用的所有插件的过程。
我还有用于自定义目的的自定义任务,例如:
substituteTemplates
做自定义行为。
我还在更改我要导入的插件的行为以应对我的自定义,例如:
packageZipTarball in Universal <<= (packageZipTarball in Universal) dependsOn substituteTemplates.
现在,一切正常,但我的插件的用户必须这样做:
val example = (project in file(".")).enablePlugins(JavaAppPackaging).settings(...
如果他不这样做,sbt 将不会编译,因为 sbt 会找到不存在的东西的定义(Universal 中的映射等......)。这是我试图解决它的方法。
拿 1
现在,我希望能够处理需要启用某些插件的事实。如果我启用插件(例如 JavaAppPackaging),那么我会做一些其他更改,否则我会保持设置不变。起初我尝试使用自定义设置键,例如:
val enableJavaAppPackaging = SettingKey[Boolean]("enableJavaAppPackaging","")
然后,我尝试使用它:
object MyWrapperPlugin extends AutoPlugin {
override def projectSettings: Seq[Setting[_]] = {
if (enableJavaAppPackaging.value) {
packageZipTarball in Universal <<= (packageZipTarball in Universal) dependsOn substituteTemplates,
mappings in Universal <++= templates.map {
_.keySet.map { k => file(s"target/templates/$k") -> k }.toList
},
// a lot of other stuff....
}
但这不能像 sbt 抱怨的那样工作:
`value` can only be used within a task or setting macro, such as :=, +=, ++=, Def.task, or Def.setting
有一种方法可以以对 sbt 也可以的方式执行这种逻辑吗?
取 2
如果我至少不能做到这一点,我想默认打开 JavaApp PAckaging 插件,所以根本不做 elsiffing。
object MyWrapperPlugin extends AutoPlugin {
override def requires: Plugins = AssemblyPlugin && DependencyGraphPlugin && JavaAppPackaging
但这也不起作用。