SBT AutoPlugin 缺少添加的工件

Posted

技术标签:

【中文标题】SBT AutoPlugin 缺少添加的工件【英文标题】:SBT AutoPlugin missing added artifact 【发布时间】:2017-08-08 17:48:44 【问题描述】:

我编写了几个 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】:

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

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

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

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

似乎与 sbt-android 的关系是巧合。

【讨论】:

以上是关于SBT AutoPlugin 缺少添加的工件的主要内容,如果未能解决你的问题,请参考以下文章

本地工件代理背后的 sbt

使用 SBT - Native Packager Plugin 添加工件以播放项目

使用 sbt-projectmatrix 创建 AutoPlugin。如何设置scalaVersion?

无法从 AutoPlugin 的命令运行自定义 sbt 任务

从 sbt 项目的安全工件下载依赖项

如何使 sbt 将非 Java 源包含到已发布的工件中?