このページでは、ファイル、ファイルのシーケンス、およびファイルフィルターについて説明します。使用される基本型は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
は取得されません。