Bazelでプロジェクトの依存関係を可視化する

2020/03/06

BAZEL C/C++ Googleサービス Linux RandomGrid Ubuntu 技術

t f B! P L

依存関係をグラフで確認する 

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)

実際にやってみた場合の表示はこんな感じ

Translate

ページビューの合計

注意書き

基本的にごった煮ブログですので、カテゴリから記事を参照していただけると読みやすいかと存じます。

ADBlocker等を使用していると、Twitterやアクセスカウンタが表示されません。

記事を読むには差し支えませんが、情報を参照したい場合には一時例外にしていただけると全てご参照いただけます。

Featured Post

ボイドラDICEの攻略法

QooQ