1. パス

パス 

このページでは、ファイル、ファイルのシーケンス、およびファイルフィルターについて説明します。使用される基本型はjava.io.Fileですが、いくつかのメソッドは暗黙的に拡張されています。

  • RichFileはFileにメソッドを追加します。
  • PathFinderはFileとSeq[File]にメソッドを追加します。
  • PathIOはファイルとI/Oに関連する一般的なメソッドを提供します。

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を作成するために、FileSeq[File]を拡張するいくつかのメソッドがあります。最終的には、結果のPathFindergetを呼び出して評価し、Seq[File]を取得します。

子孫の選択 

**メソッドはjava.io.FileFilterを受け入れ、そのフィルターに一致するすべてのファイルを選択します。

def scalaSources(base: File): PathFinder = (base / "src") ** "*.scala"

get 

これは、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です。暗黙的な型変換を使用して、StringNameFilterに変換します。この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.pngleft.png が取得されますが、logo.png は取得されません。