fiskeben пише:
Мінус полягає в тому, що він не є повністю автоматичним, тобто він не вилучає імена пакунків з 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 's. Потім ми читаємо цей список назв пакетів у whileциклі.
RES- кількість зустріч імені пакета в лапках. Зараз це import/ require... 'package'/ "package". Це робить роботу в більшості випадків.
Тоді ми просто підраховуємо кількість рядків результатів, після чого друкуємо результат.
Застереження:
- Не знайдемо файлів у різному імпорті, наприклад
tsconfig.jsonфайлів (lib опція)
- Ви повинні
grepвручну лише ^USEDта UNUSEDфайли.
- Для великих проектів це повільно - сценарії оболонки часто не дуже масштабні. Але, сподіваємось, ви не будете працювати так багато разів.