諸如 package
、packageSrc
和 packageDoc
之類的任務,接受從輸入檔案到在結果 artifact (jar) 中使用的路徑,類型為 Seq[(File, String)]
的映射。類似地,複製檔案的任務接受從輸入檔案到目標檔案,類型為 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
方法會根據一個或多個基準目錄 (第一個參數) 將輸入檔案相對化,然後將基準 String 或 File (第二個參數) 加到結果的前面。與 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 )