How to copy some files to the build target directory with SBT?

前端 未结 2 1876
故里飘歌
故里飘歌 2021-01-04 19:18

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 e

相关标签:
2条回答
  • 2021-01-04 20:05

    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
    
    0 讨论(0)
  • 2021-01-04 20:12

    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
    
    0 讨论(0)
提交回复
热议问题