Composerで管理するライブラリ名から、プロジェクト内で依存しているファイルを一覧表示する


概要

PHPのプロジェクトで、Composerで管理しているライブラリをアップデートする際に影響するファイルを確認するためのスクリプトを作りました。
ライブラリアップデート時の動作確認などで、どこを確認したら良いのかなどがパッと把握しやすいので便利です。

Script

  • 以下のスクリプトをプロジェクト直下に作成します。composer.jsonが同じディレクトリに存在している事を前提にしているので、構成によっては微調整が必要です。
  • 以下に依存しています
    • git
    • jq
search_dependenty.sh
#!/bin/sh

if [ "$1" = "" ] ; then
  MESSAGE="No package name."
  echo "\033[31m$MESSAGE\033[m" && exit 1
fi

# ライブラリのnamespaceを取得。composer.jsonが同じディレクトリにない場合は--working-dirで指定する
KEY=`composer show -f json $1 | jq -r '.autoload[]|keys[0]'`

MESSAGE="List of files that depend on '$1'.\n"
# カラー表示
echo "\033[32m$MESSAGE\033[m"

# ファイル名のみ。特殊な文字列をエスケープしないで検索。
FILES=`git grep -lF $KEY -- ':!*Test.php'`
echo "$FILES\n"

COUNT=`echo "$FILES" | wc -l`
echo "Total Dependent Files:\033[32m${COUNT#      }\033[m"

exit 0

使い方

サンプルプロジェクトの構成

以下のような構成で、先ほどのスクリプトを実行してみます。

$ tree
.
├── composer.json
├── composer.lock
├── search_dependenty.sh
├── src
│   └── SampleService
│       └── SampleService.php  // guzzlehttp/guzzleに依存するクラス
└── vendor
composer.json
{
    "type": "project",
    "autoload": {
        "psr-4": {
            "Sample\\": "src/"
        }
    },
    "require": {
        "guzzlehttp/guzzle": "^7.4"
    }
}

実行結果

$ ./search_dependenty.sh guzzlehttp/guzzle
List of files that depend on 'guzzlehttp/guzzle'.

src/SampleService/SampleService.php

Total Dependent Files: 1