SBT AutoPlugin缺少添加的工件

时间:2017-03-17 08:50:41

标签: sbt

我编写了几个AutoPlugins来简化我的多项目sbt构建。

其中一个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-android AutoPlugin产生所需的神器,而它消失了,如果我添加一个sbt-android AutoPlugin。

我还在enablePlugins中使用了插件的顺序。

我正在使用"org.scala-android" %% "sbt-android" % "1.7.2"sbt 0.13.13

1 个答案:

答案 0 :(得分:0)

我自己找到了解决问题的方法。

经过一番挖掘后,我发现CorePlugin将artifacts重置为Nil

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

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

sbt-android 的看似关系巧合。