Package.jsonファイルに不要になったパッケージがあるかどうかを判断する方法はありますか?
たとえば、パッケージを試して、後でコードをコメント化または削除し、アンインストールするのを忘れた場合、削除できるパッケージがいくつかあります。
パッケージを安全に削除できるかどうかを判断する効率的な方法は何でしょうか?
depcheck というnpmモジュールを使用できます。
モジュールをインストールします。
npm install depcheck -g
それを実行して、未使用の依存関係を見つけます。
depcheck
このアプローチの良い点は、find
またはgrep
コマンドを覚える必要がないことです。
インストールせずにを実行するにはnpxを使用します。
npx depcheck
OS(Linux、OSXなど)などのUnixを使用している場合は、find
とegrep
の組み合わせを使用して、パッケージ名を含むrequireステートメントを検索できます。
find . -path ./node_modules -Prune -o -name "*.js" -exec egrep -ni 'name-of-package' {} \;
require('name-of-package')
ステートメント全体を検索する場合は、正しいタイプの引用符を使用してください。
find . -path ./node_modules -Prune -o -name "*.js" -exec egrep -ni 'require("name-of-package")' {} \;
または
find . -path ./node_modules -Prune -o -name "*.js" -exec egrep -ni "require('name-of-package')" {} \;
欠点は、完全に自動化されていないことです。つまり、package.json
からパッケージ名を抽出してチェックしません。パッケージごとにこれを行う必要があります。 package.json
は単なるJSONであるため、child_process.exec
を使用して各依存関係に対してこのコマンドを実行する小さなスクリプトを記述することにより、これを修正できます。そして、それをモジュールにします。そして、NPMリポジトリに追加します...
fiskebenの書き込み:
欠点は、完全に自動化されていないことです。つまり、package.jsonからパッケージ名を抽出してチェックしません。パッケージごとにこれを行う必要があります。
何らかの理由でdepcheck
が正しく機能しない場合は、Fiskebenの回答を自動化しましょう! (たとえば、TypeScriptで試してみたが、不必要な解析エラーが発生した)
package.json
の解析には、ソフトウェア jq
を使用できます。以下のシェルスクリプトには、開始するディレクトリ名が必要です。
#!/bin/bash
DIRNAME=${1:-.}
cd $DIRNAME
FILES=$(mktemp)
PACKAGES=$(mktemp)
find . \
-path ./node_modules -Prune -or \
-path ./build -Prune -or \
\( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print > $FILES
function check {
cat package.json \
| jq "{} + .$1 | keys" \
| sed -n 's/.*"\(.*\)".*/\1/p' > $PACKAGES
echo "--------------------------"
echo "Checking $1..."
while read PACKAGE
do
RES=$(cat $FILES | xargs -I {} egrep -i "(import|require).*['\"]$PACKAGE[\"']" '{}' | wc -l)
if [ $RES = 0 ]
then
echo -e "UNUSED\t\t $PACKAGE"
else
echo -e "USED ($RES)\t $PACKAGE"
fi
done < $PACKAGES
}
check "dependencies"
check "devDependencies"
check "peerDependencies"
最初に、パッケージ名とファイルをキャッシュできる2つの一時ファイルを作成します。
find
コマンドで始まります。 1行目と2行目は、node_modules
およびbuild
フォルダー(または必要なもの)を無視します。 3行目には許可されている拡張子が含まれています。ここにさらに追加できます。 JSXまたはJSONファイル。
関数は依存型を読み取ります。
最初にcat
s the package.json
。次に、jq
が必要な依存関係グループを取得します。 ({} +
が存在するため、ファイルにピアの依存関係がない場合などにエラーをスローしません。)
その後、sed
は、引用符で囲まれた部分、パッケージ名を抽出します。 -n
および.../p
は、jq
のJSON出力から一致する部分のみを印刷するように指示します。次に、このパッケージ名のリストをwhile
ループに読み込みます。
RES
は、引用符で囲まれたパッケージ名の出現回数です。今はimport
/require
... 'package'
/"package"
です。ほとんどの場合、仕事をします。
次に、結果の行数をカウントして、結果を出力します。
警告:
tsconfig.json
ファイル(lib
オプション)^USED
およびgrep
ファイルのみを手動でUNUSED
する必要があります。この目的のために、以下のnpmモジュールを使用できます。