依存関係をグラフで確認する
Bazel を調査検討していて、一番衝撃を受けたのがビルドツール単体でグラフ出力が出来るこの機能です。
プロジェクトが巨大になればなるほど、どのライブラリがどこで使用されていてそいつがどのソースからビルドされていて……とか追えなくなってくるんですよね。
C/C++の場合、変更容易性を確保することとモジュール結合の隠蔽がニアイコールになってしまう場合があり(そんな設計するやつは後ろから画面に顔面叩き込んでやる)、後からプロジェクトに参加人たちにとって見ればやはりどういう構成になっているのか解り難くなりがちです。
出力したグラフを使って説明できれば、理解を促進する効果がのぞめます。
実際の手順
BUILD ファイルのルールによってビルドに成功した場合、Bazel はプロジェクトの依存関係をグラフ化して作成しています。 Bazel はこの情報を使用して差分ビルド行いますが、これを可視化することも出来ます。サンプルプロジェクトのグラフ情報を可視化してみましょう。
初めに、Bazel が作成した依存関係のグラフ情報をテキスト表現に変換しましょう。
bazel query --notool_deps --noimplicit_deps 'deps(//main:hello-world)' --output graphこのコマンドは、//main:hello-world ターゲットに含まれる依存関係をグラフとして出力するものです。
ただし、このグラフには標準ライブラリや暗黙的な依存関係は含まれません。
digraph mygraph { node [shape=box]; "//main:hello-world" "//main:hello-world" -> "//main:hello-world.cc" "//main:hello-world.cc" } Loading: 0 packages loaded
このテキストをコピーして、GraphVizオンライン版にペーストすることで手軽に確認することが出来ます。
実使用するのであれば、
bazel query --notool_deps --noimplicit_deps 'deps(//main:hello-world)' --output graph > result.txtなどとしてファイル出力してしまったほうが使いやすいかもしれません。
実行環境が Ubuntu の場合は、GrawphViz と xdot をインストールすることで、ローカル環境でグラフを確認することが出来ます。
sudo apt update && sudo apt install graphviz xdot
GrawphViz と xdot をインストールしたら、Linux のパイプを使って xdot に出力を直接渡して表示させることが出来ます。
保存や印刷も可能です。
xdot <(bazel query --notool_deps --noimplicit_deps 'deps(//main:hello-world)' --output graph)
実際にやってみた場合の表示はこんな感じ
0 件のコメント:
コメントを投稿