Search code examples
scalasbtsbt-assembly

sbt-assembly does not pick up configuration specific settings


I am updating an old 0.7.x build file from the tool sbt that thankfully removed the reference to "simple" from its name in the meantime.

Something that once worked, does not do so any longer. I had different config entries for platform specific assembly tasks. These include specific filters that for some reason are now called assemblyExcludedJars instead of excludedJars, and specific jar names that for some reason are now called assemblyJarName instead of jarName.

Basically:

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
  )

Now I would expect that if I run sbt assembly-foo or sbt foo:assembly, it would produce a file wtf.jar. But I am getting the default root-assembly-0.1-snapshot.jar. The same problem happens when I try to specify assemblyExcludedJars, they are simply ignored and still included.


If I remove the inConfig it works:

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

But now I cannot use different jar names for different configurations (which is the whole point).


As described 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 Stackoverflow question. But the example requires an antique version of sbt-assembly (0.9.0 from 2013, before auto plugins etc.) and doesn't seem to apply to the current versions.


Solution

  • If one defines a new configuration, one has to redefine (?) all the tasks one is about to use. Apparently for sbt-assembly, this means running 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
      )
    

    Tested with sbt 0.13.9 and sbt-assembly 0.14.1.