0

我开发了一个自定义 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

但这也不起作用。

4

0 回答 0