fiskeben escreveu:
A desvantagem é que não é totalmente automático, ou seja, não extrai os nomes dos pacotes do package.json e os verifica. Você precisa fazer isso para cada pacote.
Vamos automatizar a resposta da Fiskeben se, por qualquer motivo, depcheck
não estiver funcionando corretamente! (Por exemplo, eu tentei com o Typecript e deu erros de análise desnecessários)
Para análise package.json
, podemos usar o software jq
. O script de shell abaixo requer um nome de diretório por onde começar.
#!/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"
Primeiro, ele cria dois arquivos temporários onde podemos armazenar em cache nomes e arquivos de pacotes.
Começa com o find
comando A primeira e a segunda linha fazem com que ignore as pastas node_modules
e build
(ou o que você quiser). A terceira linha contém extensões permitidas, você pode adicionar mais aqui, por exemplo, arquivos JSX ou JSON.
Uma função lerá tipos dependentes.
Primeiro cat
é o package.json
. Em seguida, jq
obtém o grupo de dependência necessário. ( {} +
existe para que ele não gere um erro se, por exemplo, não houver dependências entre pares no arquivo.)
Depois disso, sed
extrai as partes entre as aspas, o nome do pacote. -n
e .../p
diz para imprimir as partes correspondentes e nada mais da jq
saída JSON de. Em seguida, lemos esta lista de nomes de pacotes em um while
loop.
RES
é o número de ocorrências do nome do pacote entre aspas. Agora é import
/ require
... 'package'
/ "package"
. Ele faz o trabalho na maioria dos casos.
Então, simplesmente contamos o número de linhas de resultado e depois imprimimos o resultado.
Ressalvas:
- Não encontrará arquivos em diferentes importações, por exemplo,
tsconfig.json
arquivos ( lib
opção)
- Você precisa
grep
manualmente apenas ^USED
e UNUSED
arquivos.
- É lento para grandes projetos - os scripts de shell geralmente não escalam bem. Mas espero que você não esteja executando tantas vezes.