最近、転職活動しながらオーラー(闇払い)の修行をやっておりますaimofです。(意訳:リファクタ必至の読めないコードの整備補助ツールを作っています)
闇の魔術に対する防衛術の先生が失踪したと聞いて、代わりに投稿します。
対象言語はGoです。
忍びの地図、ご存知ですか?
「闇の魔術の防衛術」の元ネタ"Harry Potter"シリーズに登場する便利アイテムで、学校内の人の動きを追跡したり、抜け道書いてあったりなんかいろいろ多機能な地図です。
地図といえば前にプログラミング中に、地図がほしい事象が合ったような……
本題
皆さん、リポジトリ内でパッケージの依存関係(特にExport先)を調べたいことってありますよね?
そんなときのために、依存関係調査ツールdeponを作成しました!(似たツールがすでにあるかは未調査)
一日で作ったのでdepon自体のソースコードが闇の魔術ですが、細かいことはおいておいて……
デモ
GOPATH
は$HOME
です。
~/src/github.com/aimof/depon/cmd/depon $ depon
Ex Im packages
1 6 github.com/aimof/depon
1 0 errors
1 0 path/filepath
1 0 strings
0 4 github.com/aimof/depon/cmd/depon
2 0 fmt
1 0 os/exec
1 0 log
1 0 flag
1 0 os
~/src/github.com/aimof/depon/cmd/depon $ depon -package github.com/aimof/depon
export: [github.com/aimof/depon/cmd/depon]
import: [fmt errors strings os/exec os path/filepath]
オプションなしで、リポジトリ内のすべてのexport、import数を表示します。(順番未整備)
-package
オプションをつけると、特定パッケージのexport, import一覧が表示されます。(同じく順番未整備)
(ちなみに--package
optionはmaster未マージだったり…)
詳細
goパッケージを含むgitリポジトリに対して、リポジトリ内の依存関係を明らかにします。
既存ツール(depth)との違いは、パッケージを指定してexport先を表示することです。
実装
type Tree struct {
root *node
allNodes mapNodes
}
type node struct {
name string
tree *Tree
parents mapNodes
children mapNodes
}
type mapNodes map[string]*node
グラフのようなものを作ってマッピングして、うまいことやります。
なぜdeponがオーラー(闇祓い)専用の汎用性の低いツールなのか?
作ってから気づきました。
__go__で、__リポジトリ内限定__で、__パッケージ単位__でexport先が知りたい状況……
それってやばくね?
解説
goは、パッケージ(ディレクトリ単位)内のファイルが多い言語で、逆にいえば、パッケージ数は少なくなりがちなのです。
パッと見ただけでexport先がわからないというのは、無駄にパッケージが多く、依存関係がめちゃくちゃな、闇の魔術的ソースコードと呼ぶにふさわしい代物です。
そんなコードと戦う環境って多くない……よね?
github.comの適当なリポジトリを見ると、サブパッケージ数が10個超えているところなんてほとんどありません。(5個こえているところすら殆ど無い)
私みたく「パッケージ数を2/3にしてやったぜ」みたいな武勇伝語る人は多くないはず。
結論?
このツールって必要なくね?
少なくともまともな環境では使い道ないけど、需要あれば開発する。
注というか課題というか言い訳
思いついてから一日で作ったので、ソースコードが闇の魔術しているけど許してください。
また、使用に制約が多いため、多分クローンしてきてインストールして使ってみてもだいたい失敗します。
READMEをほしい同士がいたらコメントください。