fiskeben schrieb:
Der Nachteil ist, dass es nicht vollautomatisch ist, dh es packt keine Paketnamen aus package.json und überprüft sie. Sie müssen dies für jedes Paket selbst tun.
Lassen Sie uns Fiskebens Antwort automatisieren, wenn sie aus irgendeinem Grund depcheck
nicht richtig funktioniert! (ZB habe ich es mit Typescript versucht und es gab unnötige Analysefehler)
Zum Parsen können package.json
wir die Software verwenden jq
. Für das folgende Shell-Skript ist ein Verzeichnisname erforderlich, mit dem begonnen werden soll.
#!/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"
Zuerst werden zwei temporäre Dateien erstellt, in denen Paketnamen und -dateien zwischengespeichert werden können.
Es beginnt mit dem find
Befehl. In der ersten und zweiten Zeile werden die Ordner node_modules
und build
(oder was auch immer Sie wollen) ignoriert . Die dritte Zeile enthält zulässige Erweiterungen. Sie können hier weitere hinzufügen, z. B. JSX- oder JSON-Dateien.
Eine Funktion liest abhängige Typen.
Zuerst ist es cat
daspackage.json
. Ruft jq
dann die erforderliche Abhängigkeitsgruppe ab. ( {} +
Ist vorhanden, damit kein Fehler ausgegeben wird, wenn z. B. keine Peer-Abhängigkeiten in der Datei vorhanden sind.)
Danach, sed
extrahiert die Teile zwischen den Anführungszeichen, der Paketnamen. -n
und.../p
weist es an, die passenden Teile und nichts anderes aus jq
der JSON-Ausgabe zu drucken . Dann lesen wir diese Liste der Paketnamen in eine while
Schleife.
RES
ist die Anzahl der Vorkommen des Paketnamens in Anführungszeichen. Im Moment ist es import
/require
... 'package'
/ "package"
. Es macht den Job in den meisten Fällen.
Dann zählen wir einfach die Anzahl der Ergebniszeilen und drucken das Ergebnis aus.
Vorsichtsmaßnahmen:
- Es werden keine Dateien in verschiedenen Importen gefunden, z
tsconfig.json
Dateien (lib
Option)
- Sie müssen
grep
nur für ^USED
und manuellUNUSED
Dateien .
- Bei großen Projekten ist es langsam - Shell-Skripte lassen sich oft nicht gut skalieren. Aber hoffentlich rennst du nicht so oft.