このプロジェクトに関数がいくつあるか知りたい ってこと無いですか?ないですか。僕はありました。
Laravelのプロジェクトなんですけど、パブリックな関数がいくつあるのか知りたかったんですね。PhpStormのプラグインだったり、色々と探したんですが、なんか欲しい情報を簡単に出せるのがありませんでした。
最近shell(bash)の書き方を覚えたばかりなので、使って書いたほうが早そうという結論に。
前提
- Bashで書いてます。shell初心者です。
- コメントアウトも拾っちゃいます。
- 文字列とかも拾っちゃいます。
- とにかく
public functionって文字列は無差別に拾います。 - 行数カウントです。
- プロジェクトルートから実行するのを想定。
ワンライナー
$ result_file="class_analysis"; [[ -f "$result_file" ]] && rm "$result_file"; touch "$result_file"; targets=("Services" "Repositories"); for target in "${targets[@]}"; do ls -1 app/"$target"/ | grep ".*Interface.php" | while IFS= read file; do echo "app/$target/$file,$(grep -c "public function" "app/$target/$file")" >> $result_file; done; done;
分解
まずは出力先ファイル名を設定。
$ result_file="class_analysis";
出力先ファイルが既に存在する場合は、削除しちゃいます。
[[ -f "$result_file" ]] && rm "$result_file";
新規で出力先ファイルを作ります。
touch "$result_file";
今回は「すべてのディレクトリ」ではなく、ある程度絞って数を見たかったため、ディレクトリをある程度絞りました。
プロジェクト的に重要なロジックが詰まっている以下の2つを対象としています。
targets=("Services" "Repositories");
対象ディレクトリで回して行きます。
for target in "${targets[@]}"; do
app 配下のファイルを1ファイル1行で表示し、パイプで出力を次の処理へ渡す。
ls -1 app/"$target"/ |
今回対象のプロジェクトではInterfaceを具象クラスと同じディレクトリに格納していたため、Interfaceだけ見ればいいや、ということでインターフェースだけで絞り込みました。
Interfaceという文字列で grep した結果を、またまたパイプで次の処理へ渡します。
grep ".*Interface.php" |
1ファイルずつ回して public function という文字列を含む行数を抜き出して、カンマ区切りでファイル名とともに echo して、その結果を出力先ファイルに追加。
while IFS= read file; do
echo "app/$target/$file,$(grep -c "public function" "app/$target/$file")" >> $result_file;
done;
ループお終い。
done;
以上
あとがき
上記、ニーズに合わせてカスタマイズして使っていただければと。
ファイルの grep 周りをもうちょっときれいにできる気がしてる。