sbt-assembly 不获取特定于配置的设置

sbt-assembly does not pick up configuration specific settings

我正在从工具 sbt 更新旧的 0.7.x 构建文件,谢天谢地,同时从其名称中删除了对 "simple" 的引用。

曾经有效的东西,不再有效。对于平台特定的组装任务,我有不同的 config 条目。其中包括由于某种原因现在称为 assemblyExcludedJars 而不是 excludedJars 的特定过滤器,以及由于某种原因现在称为 assemblyJarName 而不是 jarName 的特定 jar 名称。

基本上:

val Foo = config("foo") extend Compile

lazy val assemblyFoo = TaskKey[File]("assembly-foo")

lazy val root = Project(id = "root", base = file("."))
  // .configs(Foo)  // needed? doesn't change anything
  .settings(
    inConfig(Foo)(inTask(assembly) {
      assemblyJarName := "wtf.jar"
    }),
    scalaVersion := "2.11.7",
    assemblyFoo <<= assembly in Foo
  )

现在我希望如果我 运行 sbt assembly-foosbt foo:assembly,它会生成一个文件 wtf.jar。但我得到的是默认 root-assembly-0.1-snapshot.jar。当我尝试指定 assemblyExcludedJars 时,同样的问题发生了,它们被简单地忽略并仍然包含在内。


如果我删除 inConfig 它会起作用:

lazy val root = Project(id = "root", base = file("."))
  .settings(
    inTask(assembly) {
      assemblyJarName := "wtf.jar"
    },
    scalaVersion := "2.11.7",
    assemblyFoo <<= assembly in Foo
  )

但现在我不能为不同的配置使用不同的 jar 名称(这就是重点)。


如所述in a blog post by one of sbt's authors and the author of sbt-assembly, this should work. It was also written in this Whosebug question。但是这个例子需要一个古老的 sbt-assembly 版本(2013 年的 0.9.0,在自动插件等之前)并且似乎不适用于当前版本。

如果定义一个新配置,则必须重新定义(?)所有将要使用的任务。显然对于 sbt-assembly,这意味着 运行 baseAssemblySettings:

val Foo = config("foo") extend Compile

lazy val assemblyFoo = TaskKey[File]("assembly-foo")

lazy val root = Project(id = "root", base = file("."))
  .settings(
    inConfig(Foo)(baseAssemblySettings /* !!! */ ++ inTask(assembly) {
      jarName := "wtf.jar"
    }),
    scalaVersion := "2.11.7",
    assemblyFoo  := (assembly in Foo).value
  )

使用 sbt 0.13.9 和 sbt-assembly 0.14.1 测试。