3

在 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.ziptarget文件夹中生成。

现在我想做一个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我意识到我可能可以直接package-war更改artifactPath. 我想以“正确”的方式做到这一点。

4

1 回答 1

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
于 2013-08-30T15:04:55.590 回答