このページでは、ファイル、ファイルのシーケンス、およびファイルフィルターについて説明します。使用される基本型はjava.io.Fileですが、いくつかのメソッドは暗黙的に拡張されています。
sbtはjava.io.Fileを使用してファイルを表し、java.io.Fileの型エイリアスFileを定義しているため、追加のインポートは不要です。fileメソッドは、文字列から新しいファイルを作成するのを簡単にするための、単一引数のFileコンストラクターのエイリアスです。
val source: File = file("/home/user/code/A.scala")
さらに、sbtはFileにパスを構築するための2つの引数を持つFileコンストラクターのエイリアスである/メソッドを追加します。
def readme(base: File): File = base / "README"
相対ファイルは、Projectのベースディレクトリを定義する場合にのみ使用する必要があります。この場合、相対ファイルは適切に解決されます。
val root = Project("root", file("."))
それ以外の場合、ファイルは絶対パスであるか、絶対ベースのFileから構築する必要があります。baseDirectory設定は、スコープに応じてビルドまたはプロジェクトのベースディレクトリを定義します。
たとえば、次の設定は、アンマネージドライブラリディレクトリをプロジェクトのベースディレクトリ内の「custom_lib」ディレクトリに設定します。
unmanagedBase := baseDirectory.value /"custom_lib"
または、より簡潔に
unmanagedBase := baseDirectory.value /"custom_lib"
この設定は、設定が定義されているプロジェクトに関係なく、シェルの履歴の場所をビルドのベースディレクトリに設定します。
historyPath := Some( (ThisBuild / baseDirectory).value / ".history"),
PathFinderは、要求に応じてSeq[File]を計算します。これは、ファイルのシーケンスを作成する方法です。PathFinderを作成するために、FileとSeq[File]を拡張するいくつかのメソッドがあります。最終的には、結果のPathFinderでgetを呼び出して評価し、Seq[File]を取得します。
**メソッドはjava.io.FileFilterを受け入れ、そのフィルターに一致するすべてのファイルを選択します。
def scalaSources(base: File): PathFinder = (base / "src") ** "*.scala"
これは、srcまたは子孫ディレクトリにある.scalaで終わるすべてのファイルを選択します。ファイルのリストは、getが呼び出されるまで実際には評価されません。
def scalaSources(base: File): Seq[File] = {
val finder: PathFinder = (base / "src") ** "*.scala"
finder.get
}
ファイルシステムが変更された場合、同じPathFinderオブジェクトで2回目のget呼び出しは変更を反映します。つまり、getメソッドは毎回ファイルのリストを再構築します。また、getは呼び出された時点で存在していたFileのみを返します。
サブディレクトリの直下の子であるファイルを選択するには、単一の*を使用します。
def scalaSources(base: File): PathFinder = (base / "src") * "*.scala"
これは、srcディレクトリにある.scalaで終わるすべてのファイルを選択します。
/、**、または*などのセレクターがディレクトリを表さないパスで使用された場合、パスリストは空になります。
def emptyFinder(base: File) = (base / "lib" / "ivy.jar") * "not_possible"
子および子孫セレクター*および**への引数は、実際にはNameFilterです。暗黙的な型変換を使用して、StringをNameFilterに変換します。このNameFilterは、*を任意の長さの任意の文字を表すものとして解釈します。詳細については、以下の名前フィルターのセクションを参照してください。
もう1つの操作は、PathFinderの連結です。
def multiPath(base: File): PathFinder =
(base / "src" / "main") +++
(base / "lib") +++
(base / "target" / "classes")
getを使用して評価すると、src/main/、lib/、およびtarget/classes/が返されます。連結されたファインダーは、すべての標準メソッドをサポートします。たとえば、
def jars(base: File): PathFinder =
(base / "lib" +++ base / "target") * "*.jar"
「lib」および「target」ディレクトリにあるすべてのjarを直接選択します。
よくある問題は、バージョン管理ディレクトリを除外することです。これは次のようにして実現できます。
def sources(base: File) =
( (base / "src") ** "*.scala") --- ( (base / "src") ** ".svn" ** "*.scala")
最初のセレクターはすべてのScalaソースを選択し、2番目のセレクターは.svnディレクトリの子孫であるすべてのソースを選択します。---メソッドは、最初のセレクターによって返されたファイルのシーケンスから、2番目のセレクターによって返されたすべてのファイルを削除します。
File => Boolean型の述語を受け入れるfilterメソッドがあり、非厳密です。
// selects all directories under "src"
def srcDirs(base: File) = ( (base / "src") ** "*") filter { _.isDirectory }
// selects archives (.zip or .jar) that are selected by 'somePathFinder'
def archivesOnly(base: PathFinder) = base filter ClasspathUtilities.isArchive
PathFinder.emptyは、getが呼び出されたときに空のシーケンスを返すPathFinderです。
assert( PathFinder.empty.get == Seq[File]() )
次のいずれかのメソッドを使用して、PathFinderを文字列に変換します。
toStringはデバッグ用です。各コンポーネントの絶対パスを独自の行に配置します。absStringは、各コンポーネントの絶対パスを取得し、プラットフォームのパスセパレーターで区切ります。getPathsは、各コンポーネントの絶対パスを含むSeq[String]を生成します。sbtのパッケージングおよびファイルコピーメソッドでは、それぞれSeq[(File,String)]およびSeq[(File,File)]型の値が必要です。これらは、入力ファイルからjar内の(文字列)パスまたは(ファイル)宛先へのマッピングです。このアプローチは、sbtの以前のバージョンからの(##メソッドを使用した)相対パスのアプローチに置き換わるものです。
マッピングについては、「マッピングファイル」ページで詳しく説明します。
*と**の引数は、java.io.FileFilter型です。sbtは、FileFilterを作成するためのコンビネーターを提供します。
まず、文字列を暗黙的にFileFilterに変換できます。結果のフィルターは、文字列に一致する名前を持つファイルを選択します。このとき、文字列の*はワイルドカードとして解釈されます。たとえば、次の例では、名前に「Test」という単語を含むすべてのScalaソースを選択します。
def testSrcs(base: File): PathFinder = (base / "src") * "*Test*.scala"
FileFilter にいくつかの便利なコンビネータが追加されました。|| メソッドは代替の FileFilter を宣言します。以下の例では、「src」配下のすべての Java または Scala のソースファイルを選択します。
def sources(base: File): PathFinder = (base / "src") ** ("*.scala" || "*.java")
-- メソッドは、最初のフィルターに一致するファイルから、2番目のフィルターに一致するファイルを除外します。
def imageResources(base: File): PathFinder =
(base/"src"/"main"/"resources") * ("*.png" -- "logo.png")
例えば、これにより right.png と left.png が取得されますが、logo.png は取得されません。