我编写了几个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
。
答案 0 :(得分:0)
我自己找到了解决问题的方法。
经过一番挖掘后,我发现CorePlugin将artifacts
重置为Nil
。
必须在插件中添加CorePlugin
或JvmPlugin
,以添加工件,以确保执行重置的设置在自己的projectSettings
之前加载。
object PluginA extends AutoPlugin {
override def requires: Plugins = JvmPlugin
...
}
与 sbt-android 的看似关系巧合。