1. マッピングファイル

マッピングファイル 

packagepackageSrcpackageDoc などのタスクは、入力ファイルから結果のアーティファクト(jar)で使用するパスへの Seq[(File, String)] 型のマッピングを受け入れます。同様に、ファイルをコピーするタスクは、入力ファイルから宛先ファイルへの Seq[(File, File)] 型のマッピングを受け入れます。Seq[(File, String)] または Seq[(File, File)] シーケンスの構築に役立つ PathFinder および Path のメソッドがいくつかあります。

このシーケンスを作成する一般的な方法は、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 メソッドは、入力ファイルを1つ以上のベースディレクトリ(最初の引数)に対して相対化し、結果にベース文字列またはファイル(2番目の引数)を付加します。 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 )