このプロジェクトに関数がいくつあるか知りたいってこと無いですか?ないですか。僕はありました。
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
周りをもうちょっときれいにできる気がしてる。