Fiskeben schrieb:
Der Nachteil ist, dass es nicht vollautomatisch ist, d. h. es extrahiert keine Paketnamen aus der package.json und überprüft sie nicht. Sie müssen dies für jedes Paket selbst tun.
Lass uns Fiskebens Antwort automatisieren, wenn aus irgendeinem Grund depcheck
nicht richtig funktioniert! (z. B. Ich habe es mit Typescript versucht und es gab unnötige Syntaxfehler)
Zum Analysieren von package.json
können wir die Software jq
verwenden. Das folgende Shell-Skript benötigt einen Verzeichnisnamen, von dem aus gestartet 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 "Überprüfe $1..."
while read PACKAGE
do
RES=$(cat $FILES | xargs -I {} egrep -i "(import|require).*['\"]$PACKAGE[\"']" '{}' | wc -l)
if [ $RES = 0 ]
then
echo -e "UNBENUTZT\t\t $PACKAGE"
else
echo -e "BENUTZT ($RES)\t $PACKAGE"
fi
done < $PACKAGES
}
check "dependencies"
check "devDependencies"
check "peerDependencies"
Zuerst erstellt es zwei temporäre Dateien, in denen wir Paketnamen und Dateien zwischenspeichern können.
Es beginnt mit dem find
Befehl. Die erste und zweite Zeile sorgen dafür, dass die Ordner node_modules
und build
(oder was auch immer du möchtest) ignoriert werden. Die dritte Zeile enthält die erlaubten Dateierweiterungen, hier kannst du weitere hinzufügen, z.B. JSX oder JSON-Dateien.
Ein Funktion wird die Abhängigkeitstypen lesen.
Zuerst wird die package.json
mit cat
ausgegeben. Dann ruft jq
die erforderliche Abhängigkeitsgruppe ab. ({} +
ist vorhanden, damit es keinen Fehler wirft, wenn z.B. keine Peer-Abhängigkeiten in der Datei sind.)
Danach extrahiert sed
die Teile zwischen den Anführungszeichen, den Paketnamen. -n
und .../p
sagen ihm, dass er nur die übereinstimmenden Teile und nichts anderes aus der JSON-Ausgabe von jq
drucken soll. Dann lesen wir diese Liste von Paketnamen in eine while
Schleife ein.
RES
ist die Anzahl der Vorkommen des Paketnamens in Anführungszeichen. Derzeit handelt es sich um import
/require
... 'package'
/"package"
. Es funktioniert für die meisten Fälle.
Dann zählen wir einfach die Anzahl der Ergebniszeilen und geben das Ergebnis aus.
Vorbehalte:
- Findet keine Dateien in verschiedenen Imports, z. B.
tsconfig.json
Dateien (Option lib
)
- Sie müssen manuell nur nach
VERWENDET
und UNBENUTZT
Dateien suchen.
- Es ist für große Projekte langsam - Shell-Skripte skalieren oft nicht gut. Aber hoffentlich werden Sie dies nicht so oft ausführen.