§ビルドのデバッグ
sbtで期待通りの動作が得られない場合は、ビルドのデバッグに役立つ、sbtが提供するいくつかの組み込みユーティリティを使用する必要があるかもしれません。
§依存関係のデバッグ
デフォルトでは、sbtはすべての依存関係のレポートを生成します。これには、推移的に他の依存関係をもたらした依存関係を示す依存関係ツリーと、複数の依存関係が要求された場合にsbtがどのバージョンの依存関係を選択したかを示す競合解決テーブルが含まれます。
レポートはXMLファイルに生成され、それに付随するXSLスタイルシートにより、XSLをサポートするブラウザでXMLレポートをHTMLに変換できます。このサポートを持つブラウザにはFirefoxとSafariが含まれ、Chromeは含まれません。
レポートはプロジェクトの`target/scala-2.12/resolution-cache/reports/`ディレクトリにあり、プロジェクトの各スコープに対して1つ生成され、`organization-projectId_scalaVersion-scope.xml`という名前が付けられます(例:`com.example-my-first-app_2.13-compile.xml`)。Firefoxで開くと、このレポートは次のようになります。
§設定のデバッグ
ビルドを理解し、問題が発生している場所を特定するために使用できる、sbtが提供するいくつかの便利なコマンドがあります。
§showコマンド
showコマンドは、任意のsbtタスクからの戻り値を表示します。たとえば、特定のソースファイルがコンパイルされているかどうかが不明な場合は、`show sources`を実行して、sbtがソースに含めているかどうかを確認できます。
[my-first-app] $ show sources
[info] ArrayBuffer(my-first-app/app/controllers/Application.scala,
my-first-app/target/scala-2.13/twirl/main/views/html/index.template.scala,
my-first-app/target/scala-2.13/twirl/main/views/html/main.template.scala,
my-first-app/target/scala-2.13/src_managed/main/routes_reverseRouting.scala,
my-first-app/target/scala-2.13/src_managed/main/routes_routing.scala,
my-first-app/target/scala-2.13/src_managed/main/controllers/routes.java)
上記の出力は、画面にきれいに収まるようにフォーマットされています。実行したタスクが長いアイテムのリストを返す場合、意味を理解するためにエディタにコピーする必要がある場合があります。
特定のスコープ(例:`Test/sources`または`Compile/sources`)、または特定のプロジェクト(`my-project/Compile/sources`)のタスクを指定することもできます。また、タスクが別のタスクによってスコープされている場合、そのスコープを指定することもできます。たとえば、プロジェクトのjarファイルにパッケージングされるすべてのものを確認するには、`packageBin`タスクをスコープとした`mappings`タスクを表示する必要があります。
[my-first-app] $ show Compile / packageBin / mappings
[info] List(
(my-first-app/target/scala-2.13/classes/application.conf,application.conf),
(my-first-app/target/scala-2.13/classes/controllers/Application.class,controllers/Application.class),
...
§inspectコマンド
inspectコマンドは、タスクの詳細な情報(依存関係、依存関係のあるタスク、定義場所など)を提供します。`show`コマンドのように使用できます。
[my-first-app] $ inspect managedSources
[info] Task: scala.collection.Seq[java.io.File]
[info] Description:
[info] Sources generated by the build.
[info] Provided by:
[info] {file:my-first-app/}root/compile:managedSources
[info] Defined at:
[info] (sbt.Defaults) Defaults.scala:185
[info] Dependencies:
[info] compile:sourceGenerators
[info] Reverse dependencies:
[info] compile:sources
...
ここでは`managedSources`コマンドを検査しています。これはファイルのシーケンスを生成するタスクであり、`ビルドによって生成されたソース`という説明があります。`sourceGenerators`タスクに依存し、`sources`タスクはそれに依存していることがわかります。また、定義場所(この場合はsbtのデフォルトのタスク定義、185行目)も確認できます。
§inspect treeコマンド
inspect treeコマンドは、特定のタスクのタスク依存関係全体のツリーを表示します。`unmanagedSources`タスクのツリーを検査すると、次のようになります。
[my-first-app] $ inspect tree unmanagedSources
[info] compile:unmanagedSources = Task[scala.collection.Seq[java.io.File]]
[info] +-*/*:sourcesInBase = true
[info] +-*/*:unmanagedSources::includeFilter = sbt.SimpleFilter@3dc46f24
[info] +-compile:unmanagedSourceDirectories = List(my-first-app/app, my-first-a..
[info] | +-compile:javaSource = app
[info] | | +-*:baseDirectory = my-first-app
[info] | | +-*:thisProject = Project(id root, base: my-first-app, configurations: List(compile,..
[info] | |
[info] | +-compile:scalaSource = app
[info] | +-*:baseDirectory = my-first-app
[info] | +-*:thisProject = Project(id root, base: my-first-app, configurations: List(compile,..
[info] |
[info] +-*:baseDirectory = my-first-app
[info] +-*/*:excludeFilter = sbt.HiddenFileFilter$@49e479da
これにより、プロジェクト内のソースを検出するためにsbtが使用するタスクのツリー全体が表示され、どのファイルをインクルードまたはエクスクルードするかを決定するためのフィルタも含まれます。`inspect tree`コマンドは、ビルドの一部がどのように構成されているか不明な場合、全体像を把握し、より深く掘り下げるために特に便利です。
§インクリメンタルコンパイルのデバッグ
Playでよくある問題として、Playが予期しないときに再コンパイルおよびリロードされることがあります。これは、ソースジェネレーターまたはIDEがPlayのクラスパス要素を意図せず更新し、リロードを強制することが原因であることがよくあります。このような問題をデバッグするには、コンパイルタスクのデバッグログを確認できます。sbtがタスクを実行すると、表示するかどうかにかかわらず、すべてのログ出力がキャプチャされるため、後で検査できます。`last`コマンドを使用して検査できます。
たとえば、`compile`を実行し、ファイルを再コンパイルする必要があるとします。
[my-first-app] $ compile
[info] Compiling 1 Scala source to my-first-app/target/scala-2.13/classes...
[success] Total time: 1 s, completed 07/04/2015 1:28:43 PM
`last compile`を実行すると、コンパイルコマンド中に発生した完全なデバッグログを出力します。多くの出力がダンプされますが、重要なのは最初の部分だけです。
[my-first-app] $ last compile
[debug]
[debug] Initial source changes:
[debug] removed:Set()
[debug] added: Set()
[debug] modified: Set(my-first-app/app/controllers/Application.scala)
[debug] Removed products: Set()
[debug] External API changes: API Changes: Set()
[debug] Modified binary dependencies: Set()
[debug] Initial directly invalidated sources: Set(my-first-app/app/controllers/Application.scala)
[debug]
[debug] Sources indirectly invalidated by:
[debug] product: Set()
[debug] binary dep: Set()
[debug] external source: Set()
これは、`my-first-app/app/controllers/Application.scala`が変更されたため、再コンパイルがトリガーされたことを示しています。
次へ: 設定
このドキュメントにエラーを発見しましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に送ってください。ご質問やアドバイスがありましたら、コミュニティフォーラムでコミュニティと話し合ってください。