Updating MappingsHelper.directory/contentOf to SBT 2.x¶
SBT 2.x replaced File-keyed mappings with virtual-file-keyed mappings (HashedVirtualFileRef).
Turning a plain java.io.File into such a reference requires the FileConverter provided by the
fileConverter setting, and that setting is only available inside a task or setting body, i.e. wherever
you can call .value.
MappingsHelper.directory(String) and MappingsHelper.contentOf(String) are usually called directly
at the top level of a build.sbt file, outside of any task/setting body, which is exactly where
fileConverter can’t be resolved. To keep the DSL working, both methods now return a
Def.Initialize[Seq[(FileRef, String)]] on SBT 2.x, which resolves the converter internally as soon as
you call .value on the result.
SBT 1.x (unchanged):
Universal / mappings ++= directory("SomeDirectoryNameToInclude")
SBT 2.x: append .value:
Universal / mappings ++= directory("SomeDirectoryNameToInclude").value
The same applies to contentOf:
Universal / mappings ++= contentOf("SomeDirectoryNameToInclude").value
Hint
If your build cross-compiles the same build.sbt against both SBT 1.x and SBT 2.x (for example
in a plugin’s own scripted tests), be aware that directory(String)/contentOf(String) do not have
the same return type on both versions, so a single source file cannot use .value unconditionally on
both. Prefer the explicit File-argument form shown above for code that has to build under both
versions, and reserve the .value shorthand for build files that only ever run under SBT 2.x.