sbt包装器插件和自定义逻辑

时间:2018-03-05 17:50:19

标签: scala sbt sbt-native-packager sbt-plugin

我开发了一个自定义sbt插件,可以导入sbt native packager和一堆其他插件。 这有助于引导scala项目,从而简化了导入我们在整个项目中使用的所有插件的过程。

我还有自定义任务,例如:

substituteTemplates

做自定义行为。

我也在改变我导入的插件的行为以应对我的自定义,例如:

packageZipTarball in Universal <<= (packageZipTarball in Universal) dependsOn substituteTemplates.

现在,一切正常但我的插件用户必须这样做:

val example = (project in file(".")).enablePlugins(JavaAppPackaging).settings(...

如果他不这样做,sbt将无法编译,因为sbt找到了不存在的东西(映射在Universal 等中的映射......)的定义。  以下是我试图解决的问题。

TAKE 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来说也可以吗?

TAKE 2

如果我不能这样做,至少我想默认转动JavaApp PAckaging插件,所以根本不做elsiffing。

object MyWrapperPlugin extends AutoPlugin {
   override def requires: Plugins = AssemblyPlugin && DependencyGraphPlugin && JavaAppPackaging

但这也行不通。

0 个答案:

没有答案