fiskeben ha scritto:
Il rovescio della medaglia è che non è completamente automatico, cioè non estrae i nomi dei pacchetti da package.json e li controlla. È necessario farlo da soli per ogni pacchetto.
Rendiamo automatizzata la risposta di Fiskeben se per qualsiasi motivo depcheck
non funziona correttamente! (Ad esempio, l'ho provato con Typescript e ha dato errori di analisi non necessari)
Per l'analisi package.json
possiamo usare il software jq
. Lo script di shell sottostante richiede un nome di directory da cui iniziare.
#!/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"
Innanzitutto crea due file temporanei in cui è possibile memorizzare nella cache nomi e file dei pacchetti.
Si inizia con il find
comando. La prima e la seconda riga lo fanno ignorare node_modules
ebuild
cartelle (o qualunque cosa tu voglia). La terza riga contiene estensioni consentite, puoi aggiungerne altre qui, ad es. File JSX o JSON.
Una funzione leggerà i tipi dipendenti.
Prima è cat
il package.json
. Quindi, jq
ottiene il gruppo di dipendenze richiesto. ( {} +
esiste in modo tale da non generare un errore se ad esempio non ci sono dipendenze tra pari nel file.)
Successivamente, sed
estrae le parti tra virgolette, il nome del pacchetto. -n
e gli .../p
dice di stampare le parti corrispondenti e nient'altro jq
dall'output JSON di. Quindi leggiamo questo elenco di nomi di pacchetti in un while
ciclo.
RES
è il numero di occorrenze del nome del pacchetto tra virgolette. In questo momento è import
/ require
... 'package'
/"package"
. Fa il lavoro per la maggior parte dei casi.
Quindi contiamo semplicemente il numero di righe del risultato, quindi stampiamo il risultato.
Avvertenze:
- Non troverai file in diverse importazioni, ad es.
tsconfig.json
File (lib
opzione)
- Devi
grep
manualmente solo per ^USED
e UNUSED
file.
- È lento per progetti di grandi dimensioni: gli script di shell spesso non si adattano bene. Ma spero che non correrai così tante volte.