为了简化我的多项目sbt构建,我编写了几个AutoPlugins。
其中一个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的类似设置会产生所需的工件,而如果我添加一个sbt,它就会消失。
我还在enablePlugins中玩插件的顺序。
我正在使用"org.scala-android" %% "sbt-android" % "1.7.2"和sbt 0.13.13。
发布于 2017-03-17 14:18:12
我自己找到了解决问题的办法。
经过一番挖掘,我发现CorePlugin将artifacts重置为Nil。
必须在插件中要求添加工件的CorePlugin或JvmPlugin,以确保进行重置的设置在自己的projectSettings之前加载。
object PluginA extends AutoPlugin {
override def requires: Plugins = JvmPlugin
...
}看起来与sbt的关系是巧合。
https://stackoverflow.com/questions/42852964
复制相似问题