How can I copy some source files (e.g. /src/main/html/*.html
) to the build output directory (e.g. /target/scala-2.11/
) with SBT so that the files end up in the target root and not in the classes
subdirectory (which is what happens if I add the source directory to unmanagedResourceDirectories
)?
You can define sbt task copying resources to target directory:
lazy val copyRes = TaskKey[Unit]("copyRes")
lazy val root:Project = Project(
...
)
.settings(
...
copyRes <<= (baseDirectory, target) map {
(base, trg) => new File(base, "src/html").listFiles().foreach(
file => Files.copy(file.toPath, new File(trg, file.name).toPath)
)
}
)
and use this task in sbt:
sbt clean package copyRes
One way would be to first collect all files you wish to copy, using for example a PathFinder
and use one of the copy
methods in sbt.io.IO
combined with Path.rebase
For the specific example in the question:
// Define task to copy html files
val copyHtml = taskKey[Unit]("Copy html files from src/main/html to cross-version target directory")
// Implement task
copyHtml := {
import Path._
val src = (Compile / sourceDirectory).value / "html"
// get the files we want to copy
val htmlFiles: Seq[File] = (src ** "*.html").get()
// use Path.rebase to pair source files with target destination in crossTarget
val pairs = htmlFiles pair rebase(src, (Compile / crossTarget).value)
// Copy files to source files to target
IO.copy(pairs, CopyOptions.apply(overwrite = true, preserveLastModified = true, preserveExecutable = false))
}
// Ensure task is run before package
`package` := (`package` dependsOn copyHtml).value
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With