在SBT中,如果我有一个应该生成包含一堆文件的zip / jar / war的任务,我会使用Defaults.packageTaskSettings
方法来设置该任务。它看起来如下:
object BuildDef extends Build {
val makeThings = TaskKey[File]("make-things")
val defaultMakeSettings = (baseDirectory) map { base => Seq(
(base / "thingA") -> "thingy",
(base / "thingB") -> "thingz"
)}
val project = Project("stuff", file("."))
.settings(Defaults.packageTaskSettings(makeThings, defaultMakeSettings): _*)
.settings(
artifact in makeThings <<= moduleName{ Artifact(_, "zip", "zip") }
)
}
效果很好,并在stuff_2.9.2-0.1-SNAPSHOT.zip
文件夹中生成target
。
现在我想制作make-things
任务的备用版本,该版本在不同的范围内运行,例如运行proguard,然后稍微不同地打包。我已将以下设置添加到BuildDef
对象:
val Scope = config("scope")
val project = ...
.settings(...)
.settings(
Defaults.packageTaskSettings(makeThings in Scope, defaultMakeSettings): _*
)
.settings(
artifact in (Scope, makeThings) <<=
moduleName{ n => Artifact(n+".scoped", "zip", "zip") }
)
当我运行scope:make-things
时,似乎忽略了该设置并使用旧设置:
> show scope:make-things
[info] ...\target\scala-2.9.2\stuff_2.9.2-0.1-SNAPSHOT.zip
为什么忽略我的设置?我希望它已经生成了stuff.scoped_2.9.2-0.1-SNAPSHOT.zip
。
了解更多信息...
> show scope:make-things::artifact
[info] Artifact(stuff.scoped,zip,zip,None,List(),None,Map())
> show scope:make-things::artifact-path
[info] ...\target\scala-2.9.2\stuff_2.9.2-0.1-SNAPSHOT.zip
我意识到我可能会直接更改artifactPath
,但我会关注xsbt-web-plugin为其package-war
任务所做的事情,并且它不会触及{{1} }}。我想以“正确”的方式做到这一点。
答案 0 :(得分:3)
我几乎在发布问题后最终搞清楚这一点。关键是使用inConfig
方法来包装包设置,如下所示:
.settings(
artifact in (Scope, makeThings) <<= moduleName{Artifact(_,"zip","zip")}
)
.settings(
inConfig(Scope){
Defaults.packageTaskSettings(makeThings, defaultMakeSettings)
}: _*
)
我还发现packageTaskSettings
将通过附加配置名称修改我的工件,只要我在 packageTaskSettings
之前指定我的工件设置。现在我得到了
...target\scala-2.9.2\stuff_2.9.2-0.1-SNAPSHOT-scope.zip