4

sbt はタスク間の依存関係を維持し、結果のグラフはかなり簡単に推論できます。一方、ソース コードをざっと見ると、インクリメンタル コンパイル ロジックはより不透明に見えます。次のことができるようになりたいです。

  • 「このインターフェイスを [このように] 変更した場合、何が無効になるでしょうか?」と同じことを言います。
  • さまざまなクラス インターフェイスの変更がビルドの残りの部分にどのように影響するかを示すグラフを作成します。Scala での暗黙的な依存関係が複雑になる可能性があることを考えると、scala のインポート依存関係をグラフ化することは、これに特に適した近似ではありません。インクリメンタル コンパイルを行うには、sbt がこの情報を何らかの形で維持する必要があるように思われるので、その情報にアクセスする方法を「ただ」見つけて、それが私のユース ケースに適した形になっていることを祈る必要があります。

これらのいずれかが実現可能ですか?私は sbt プラグインを書くことに反対しているわけではありませんが、進め方についてのヒントをいただければ幸いです。

編集: は有望なようRelationです。usesInternalSrc(dep: File): Set[File]これで sbt の依存関係に関するすべての知識が得られるでしょうか?

編集 2: さらに有望なのはDotGraph、sbt ソース ツリー内にオブジェクトがあることです。ドキュメントはなく、Google には人間が読めるテキストがありません。使い方がわかったら、回答を投稿します。

4

1 に答える 1

3

サンプルconsole-projectセッション:

> val (s, a) = runTask(compile in Compile, currentState)
> DotGraph.sources(a.relations, file("source-graph"), Nil)

source-graphソース依存ファイルとバイナリ ファイルの 2 つのドット ファイルを含むディレクトリです。a.relationsまたは、質問で示唆されているように、タイプRelationsと直接やり取りすることもできます。これは、sbt の依存関係の知識をすべてキャプチャします。0.13 では、どの依存関係が別のソース ファイルからの継承によるものかについての情報もあります。

ソース ファイルの変更が無効化にどのように影響するかという点では、非常に粗いものです。非公開の署名を変更すると、ソースが変更済みとしてマークされます。0.12 以前では、これにより少なくとも直接的な依存関係が無効になり、それ以上の依存関係が無効になる可能性があります。0.13 では、これは直接的な依存関係のみを無効にします。ただし、継承された依存関係は推移的に無効になります。現在、ソース ファイルの非プライベート API が変更されたときに何が無効化されるかを確認する方法は、実行する以外にありません。

于 2013-06-21T20:21:13.860 に答える