1. 映射檔案

映射檔案 

諸如 packagepackageSrcpackageDoc 之類的任務,接受從輸入檔案到在結果 artifact (jar) 中使用的路徑,類型為 Seq[(File, String)] 的映射。類似地,複製檔案的任務接受從輸入檔案到目標檔案,類型為 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 )

Rebase 

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 )

Flatten 

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 )