如何解决我可以相对复制sbt中的文件吗?
我有这样的目录结构:
a
/one
hey.class
hey.tasty
you.class
you.tasty
/two
foo.class
foo.tasty
/three
bar.class
bar.tasty
b
/one
/two
/three
在sbt任务中,我需要一种方法将所有.tasty文件从/ a中的相应位置复制到/ b中的相应位置。
解决方法
您可以创建sbt任务,并通过以下方式传递原始文件夹和目标文件夹:
val copyTasties = inputKey[Unit]("Copy .tasty files")
copyTasties := {
val userInput = Def.spaceDelimited().parsed
if (userInput.size != 2) {
throw new IllegalArgumentException("Original and target directories should be define!")
}
val from = Paths.get(userInput.head)
val to = Paths.get(userInput.last)
Files
.walk(from)
.filter(Files.isRegularFile(_))
.filter(path => path.toString.endsWith("tasty"))
.forEach { original =>
val relative = from.relativize(original)
val destination = to.resolve(relative)
IO.copyFile(original.toFile,destination.toFile)
}
}
然后您可以像这样调用它:
copyTasties C:\\Dev\\sandbox\\a C:\\Dev\\sandbox\\b
如果原始文件和目标文件稳定(例如,它们是项目内的目录),则可以重写任务:
import java.nio.file.{Files,Paths}
import sbt._
val copyTastiesHardcoded = taskKey[Unit]("Copy .tasty files")
copyTastiesHardcoded := {
val baseDir = baseDirectory.value.toPath
val from = baseDir.resolve("a")
val to = baseDir.resolve("b")
Files
.walk(from)
.filter(Files.isRegularFile(_))
.filter(path => path.toString.endsWith("tasty"))
.forEach { original =>
val relative = from.relativize(original)
val destination = to.resolve(relative)
IO.copyFile(original.toFile,destination.toFile)
}
}
并在不带参数的情况下调用它
copyTastiesHardcoded
,
sbt中有一些有用的实用程序方法,这些方法可以帮助您查找文件并将其复制。不幸的是,传统java.io.File
与现代java.nio.file.Path
混合使用,因此您需要在它们之间进行转换:
val copyFiles = taskKey[Unit]("copy files")
copyFiles := {
val inputDir = baseDirectory.value.toPath / "a"
val files: Seq[(Path,FileAttributes)] =
FileTreeView.default.list(inputDir.toGlob / RecursiveGlob / "*.tasty")
val outputDir = baseDirectory.value.toPath / "b"
IO.copy {
files.map { case (p,_) =>
p.toFile -> outputDir.resolve(inputDir.relativize(p)).toFile
}
}
}
请注意,我在这里使用glob查找文件: https://www.scala-sbt.org/1.x/docs/Globs.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。