TL;DR

複数の対象の間の依存関係を表す有向グラフ。ノードが対象で、辺は「ある対象を評価する前に、別の対象を先に評価する必要がある」ことを表す。

なぜ必要か

依存グラフがあれば、どの順に処理すればよいかを決められる。Wikipedia では、パッケージのインストーラが未インストールの依存を探す例、Make や npm などのビルドシステムが変更の影響を受けるファイルだけを再ビルドする例、スプレッドシートがセルの計算順を決める例を挙げている。

仕組み

Wikipedia によると、どの対象も依存先より後に評価される順序が、正しい評価順序になる。これはトポロジカル順序であり、トポロジカルソートで求められる。依存が循環していると(循環依存)、正しい評価順序は存在しない。循環のない依存グラフは DAG である。

例

Rust では、cargo tree で依存グラフをツリーとして表示できる。

myproject v0.1.0 (/myproject)
└── rand v0.7.3
    ├── getrandom v0.1.14
    │   ├── cfg-if v0.1.10
    │   └── libc v0.2.68
    ├── libc v0.2.68 (*)
    └── rand_core v0.5.1 (*)

(*) は、依存がグラフの別の場所ですでに表示されたことを示す。-d を付けると複数のバージョンで入っている依存だけを、-i を付けると指定したパッケージに依存しているパッケージを表示する。

Effective Rust の項目 25 によると、ある依存クレートで有効になるフィーチャは、依存グラフ全体で指定されたフィーチャの和集合になる(フィーチャ統合)。Effective TypeScript の項目 82 では、JavaScript から TypeScript へ、依存関係グラフの下から上に向かってモジュールごとに移行するよう勧めている。

関連

出典