фискебен написал (а):
Недостатком является то, что он не полностью автоматический, то есть он не извлекает имена пакетов из package.json и проверяет их. Вы должны сделать это для каждого пакета самостоятельно.
Давайте сделаем ответ Фискебена автоматизированным, если по какой-либо причине depcheck
он не работает должным образом! (Например, я попробовал это с 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"
Сначала он создает два временных файла, где мы можем кэшировать имена пакетов и файлы.
Это начинается с find
команды. Первая и вторая строка заставляют игнорировать node_modules
иbuild
папки (или что вы хотите). Третья строка содержит допустимые расширения, здесь вы можете добавить больше, например, файлы JSX или JSON.
Функция будет читать зависимые типы.
Сначала это cat
ВЛЯЕТСЯ package.json
. Затем jq
получает требуемую группу зависимостей. ( {} +
есть ли, чтобы он не выдавал ошибку, если, например, в файле нет одноранговых зависимостей.)
После этого sed
извлекаются части между кавычками, название пакета. -n
и .../p
говорит ему напечатать соответствующие части и ничего больше из jq
вывода JSON. Затем мы читаем этот список имен пакетов в while
цикл.
RES
количество вхождений имени пакета в кавычках. Прямо сейчас это import
/ require
... 'package'
/ "package"
. Это делает работу в большинстве случаев.
Затем мы просто посчитаем количество строк результата и напечатаем результат.
Предостережения:
- Не найдет файлы в разных импорте, например,
tsconfig.json
файлы (lib
опция)
- Вы должны
grep
вручную только ^USED
и UNUSED
файлы.
- Это медленно для больших проектов - сценарии оболочки часто плохо масштабируются. Но, надеюсь, вы не будете запускать это много раз.