理系学生日記

おまえはいつまで学生気分なのか

モジュール間の依存関係図をGraphvizで図示する

ちょっとライブラリ間の依存関係を可視化することになりました。

おなじみ Excel 方眼紙に書くというのも考えたんですが、Microsoft Office のオブジェクトで描画するのって、依存関係が複雑になるほど大変になってきます。

ほらー、きっとモジュール 1 つを矩形とかで表現することになるじゃないですかー。その矩形間を矢印のオブジェクトで繋げていくことになってー、その矢印が多くなってくるとマウスクリックすら難しくなるしー、矩形上で矢印をくっつけるポイントも多くないので矢印が混雑してくるしー、なにより Excel って差分が残らないから何が変わったのか分からないしーーーー。

依存関係というのは基本的には有向グラフになるわけですが、有向グラフを書くんだったらそれ用のソフトウェアがあるわけなので、それを使えば良いのではと思っております。

例えば、すごくシンプルな例ですが、以下のような有向グラフが出力できます。

nf:id:kiririmode:20170415193103p:plain

これを作り出すのは以下のような設定ファイル。これを dot -Tpng projects.dot -o projects.png でコマンド実行して、png ファイルを出力しています。

// プロジェクトの依存関係
digraph projects {

  // グラフ全体の定義
  graph [
    charset = "UTF-8";
  ]
  // 矢印の定義
  node [
    style="solid,filled"
  ]

  // プロジェクトの定義
  common, batch, daemon, web, api1, api2;
  testsupport [label = "test-support"];

  // 依存関係の定義
  batch  -> common;
  daemon -> common;
  web    -> common;
  api1   -> common;
  api2   -> common;
  common -> testsupport;
}

上の有向グラフは、dot というコマンドで生成していました。このコマンドは、主に階層構造やフローを表現するような有向グラフを作成します。 一方で、このような「形」が気に入らなかった場合は、他の形でグラフを生成することもできます。

例えば、dot の代わりに、"ばね" モデルを用いたエネルギーが最小化される形式でのグラフを neato コマンドで作ることができます。 同じ依存関係であっても、ずいぶんと形が変わるものですね。

f:id:kiririmode:20170415193147p:plain

他にもモジュールの依存関係だったら、以下にギャラリーの作品があったりしますので、ご参考になれば。