2017-03-17 51 views
0

我已经写了几个AutoPlugins来简化我的多项目构建。SBT AutoPlugin缺少添加的神器

其中一个AutoPlugins定义了一个TaskKey[File],并为该任务的结果添加了一个工件。

object PluginA extends AutoPlugin { 
    val content: SettingKey[File] = taskKey[String]("") 
    val generateArtifact: TaskKey[File] = taskKey[File]("generated artifact file") 

    override lazy val projectSettings: Seq[Def.Setting[_]] = { 
    addArtifact(
     Artifact("foo", "xml", "xml"), generateArtifact 
    ).settings ++ 
     Seq(
     generateArtifact := { 
      val bar = content.value 
      ... 
     } 
    ) 
    } 
} 

然后,我有另一种AutoPlugin是requires插件上面添加一些设置。

object PluginB extends AutoPlugin { 
    override def requires: Plugins = PluginA 
    override lazy val projectSettings: Seq[Def.Setting[_]] = Seq(
    content := "..." 
) 
} 

一切都很好。 现在我尝试新的神器添加到我的项目`build.sbt``

val someModule = (project in file("Module")).enablePlugins(PluginB, AndroidJar) 
val someApp = (project in file("Application")).enablePlugins(PluginB, AndroidApp) 

可悲的是,当我在SBT控制台输入publishLocal只有默认的构件发布,但不是我的新的XML文件。 show artifacts也没有列出神器。

但是,我知道插件和插件设置加载,因为show generateArtifact产生所需的文件。这只是在某处丢失的神器。

的(据我可以看到)类似的设置没有任何SBT-机器人AutoPlugin产生期望的伪影,而它消失,如果我添加一个SBT-机器人AutoPlugin。

我也玩过enablePlugins插件的顺序。我使用"org.scala-android" %% "sbt-android" % "1.7.2"sbt 0.13.13

回答

0

我自己发现了我的问题的解决方案。

经过一番挖掘,我发现CorePlugin重置artifactsNil

必须在插件中添加CorePluginJvmPlugin,该插件添加工件以确保执行重置的设置在自己的projectSettings之前加载。

object PluginA extends AutoPlugin { 
    override def requires: Plugins = JvmPlugin 
    ... 
} 

的表面上的关系SBT-的Android是巧合。