类似 package
、packageSrc
和 packageDoc
这样的任务接受类型为 Seq[(File, String)]
的映射,从输入文件到在生成的工件(jar)中使用的路径。类似地,复制文件的任务接受类型为 Seq[(File, File)]
的映射,从输入文件到目标文件。PathFinder
和 Path
上的一些方法可能对构造 Seq[(File, String)]
或 Seq[(File, File)]
序列很有用。
构建此序列的一种常见方法是从 PathFinder
或 Seq[File]
(隐式可转换为 PathFinder
)开始,然后调用 pair
方法。有关详细信息,请参阅 PathFinder
API,但本质上,此方法接受一个函数 File => Option[String]
或 File => Option[File]
,用于生成映射。
Path.relativeTo
方法用于将 File
映射到其相对于基本目录或目录的路径 String
。relativeTo
方法接受基本目录或基本目录序列,以相对于其对输入文件进行相对化。对于基本目录序列,第一个作为输入文件祖先的目录将被使用。
例如
import Path.relativeTo
val files: Seq[File] = file("/a/b/C.scala") :: Nil
val baseDirectories: Seq[File] = file("/a") :: Nil
val mappings: Seq[(File,String)] = files pair relativeTo(baseDirectories)
val expected = (file("/a/b/C.scala") -> "b/C.scala") :: Nil
assert( mappings == expected )
Path.rebase
方法相对于一个或多个基本目录(第一个参数)对输入文件进行相对化,然后将基本字符串或文件(第二个参数)附加到结果。与 relativeTo
一样,对于多个基本目录,第一个作为输入文件祖先的基本目录将被使用。
例如,以下演示了使用 rebase
构建 Seq[(File, String)]
import Path.rebase
val files: Seq[File] = file("/a/b/C.scala") :: Nil
val baseDirectories: Seq[File] = file("/a") :: Nil
val mappings: Seq[(File,String)] = files pair rebase(baseDirectories, "pre/")
val expected = (file("/a/b/C.scala") -> "pre/b/C.scala" ) :: Nil
assert( mappings == expected )
或者,要构建 Seq[(File, File)]
import Path.rebase
val files: Seq[File] = file("/a/b/C.scala") :: Nil
val baseDirectories: Seq[File] = file("/a") :: Nil
val newBase: File = file("/new/base")
val mappings: Seq[(File,File)] = files pair rebase(baseDirectories, newBase)
val expected = (file("/a/b/C.scala") -> file("/new/base/b/C.scala") ) :: Nil
assert( mappings == expected )
Path.flat
方法提供了一个函数,将文件映射到路径的最后一个组件(其名称)。对于文件到文件的映射,输入文件将映射到给定目标目录中具有相同名称的文件。例如
import Path.flat
val files: Seq[File] = file("/a/b/C.scala") :: Nil
val mappings: Seq[(File,String)] = files pair flat
val expected = (file("/a/b/C.scala") -> "C.scala" ) :: Nil
assert( mappings == expected )
要使用 flat
构建 Seq[(File, File)]
import Path.flat
val files: Seq[File] = file("/a/b/C.scala") :: Nil
val newBase: File = file("/new/base")
val mappings: Seq[(File,File)] = files pair flat(newBase)
val expected = (file("/a/b/C.scala") -> file("/new/base/C.scala") ) :: Nil
assert( mappings == expected )
要尝试对文件应用多个替代映射,请使用 |
,它隐式添加到类型为 A => Option[B]
的函数中。例如,要尝试相对于一些基本目录对文件进行相对化,但回退到扁平化
import Path.relativeTo
val files: Seq[File] = file("/a/b/C.scala") :: file("/zzz/D.scala") :: Nil
val baseDirectories: Seq[File] = file("/a") :: Nil
val mappings: Seq[(File,String)] = files pair ( relativeTo(baseDirectories) | flat )
val expected = (file("/a/b/C.scala") -> "b/C.scala") ) :: (file("/zzz/D.scala") -> "D.scala") ) :: Nil
assert( mappings == expected )