фискебен написал (а):
Недостатком является то, что он не полностью автоматический, то есть он не извлекает имена пакетов из 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файлы.
- Это медленно для больших проектов - сценарии оболочки часто плохо масштабируются. Но, надеюсь, вы не будете запускать это много раз.