1. 映射文件

映射文件 

类似 packagepackageSrcpackageDoc 这样的任务接受类型为 Seq[(File, String)] 的映射,从输入文件到在生成的工件(jar)中使用的路径。类似地,复制文件的任务接受类型为 Seq[(File, File)] 的映射,从输入文件到目标文件。PathFinderPath 上的一些方法可能对构造 Seq[(File, String)]Seq[(File, File)] 序列很有用。

构建此序列的一种常见方法是从 PathFinderSeq[File](隐式可转换为 PathFinder)开始,然后调用 pair 方法。有关详细信息,请参阅 PathFinder API,但本质上,此方法接受一个函数 File => Option[String]File => Option[File],用于生成映射。

相对于目录 

Path.relativeTo 方法用于将 File 映射到其相对于基本目录或目录的路径 StringrelativeTo 方法接受基本目录或基本目录序列,以相对于其对输入文件进行相对化。对于基本目录序列,第一个作为输入文件祖先的目录将被使用。

例如

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 )