641 Stimmen

Wie finde ich unbenutzte Pakete in package.json?

Gibt es eine Möglichkeit festzustellen, ob sich Pakete in Ihrer package.json-Datei befinden, die nicht mehr benötigt werden?

Zum Beispiel, wenn Sie ein Paket ausprobieren und später Code kommentieren oder löschen, aber vergessen, es zu deinstallieren, habe ich am Ende ein paar Pakete, die gelöscht werden könnten.

Was wäre eine effiziente Möglichkeit festzustellen, ob ein Paket sicher gelöscht werden kann?

12voto

gombosg Punkte 734

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.

11voto

Mujahidul Islam Punkte 165

Zum Überprüfen von nicht verwendeten Abhängigkeiten, Bibliotheken und nicht importierten Dateien

 npx unimported 

Sie erhalten ein Ergebnis ähnlich wie dieses Geben Sie hier die Bildbeschreibung ein

6voto

fiskeben Punkte 3247

Wenn Sie ein Unix-ähnliches Betriebssystem verwenden (Linux, OSX usw.), können Sie eine Kombination aus find und egrep verwenden, um nach require-Anweisungen zu suchen, die den Namen Ihres Pakets enthalten:

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'name-of-package' {} \;

Wenn Sie nach der gesamten require('name-of-package')-Anweisung suchen, denken Sie daran, die richtige Art von Anführungszeichen zu verwenden:

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'require("name-of-package")' {} \;

oder

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni "require('name-of-package')" {} \;

Der Nachteil ist, dass es nicht vollautomatisch ist, d.h. es extrahiert keine Paketnamen aus package.json und überprüft sie. Sie müssen dies für jedes Paket selbst tun. Da package.json nur JSON ist, könnte dies durch das Schreiben eines kleinen Skripts behoben werden, das child_process.exec verwendet, um diesen Befehl für jede Abhängigkeit auszuführen. Und machen Sie es zu einem Modul. Und fügen Sie es dem NPM-Repo hinzu...

4voto

Sapnesh Naik Punkte 9661

In Yarn 2.x und höher, verwenden Sie:

yarn dlx depcheck

yarn dlx ist darauf ausgelegt, einmalige Skripte auszuführen, die möglicherweise als globale Pakete mit yarn 1.x installiert wurden. Die Verwaltung von systemweiten Paketen liegt außerhalb des Anwendungsbereichs von yarn. Aus diesem Grund wurde yarn global entfernt.

Quelle: https://yarnpkg.com/getting-started/migration#use-yarn-dlx-instead-of-yarn-global

2voto

Manwe Punkte 381

Es sei denn, ich habe etwas über die Skripte von gombosg und nMo missverstanden. Hier ist eine schnellere Version des nMo Skripts mit Standardeinstellung auf 'find', das aber leicht so modifiziert werden kann, dass 'fd' für die Suchfunktion verwendet wird.

Die Änderungen bestehen darin, dass zuerst alle relevanten Dateien gefunden und dann alle relevanten Dateien auf einmal nach Paketen durchsucht werden und nicht Datei für Datei.

Die Parallelität kann gesteuert werden und liegt standardmäßig bei 8.

#!/bin/bash
DIRNAME=${1:-.}
cd "$DIRNAME"

FILES=$(mktemp)
PACKAGES=$(mktemp)

export NUMCONCURRENT=8

function findCmd {
  startPath=${1:-.}
  find "$startPath" \
    -path ./node_modules -prune -or \
    -path ./build -prune -or \
    \( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print
}

# use fd
# https://github.com/sharkdp/fd
function findCmd_fd {
  startPath=${1:-.}
  fd  -t f '(js|ts|json)$' "$startPath"
}

function check {
    cat package.json \
        | jq "{} + .$1 | keys" \
        | sed -n 's/.*"\(.*\)".*/\1/p' > "$PACKAGES"
    echo "--------------------------"
    echo "Überprüfe $1..."

    findCmd > "$FILES"
    while read PACKAGE
    do
        #echo "node_modules/${PACKAGE}"
        if [ -d "node_modules/${PACKAGE}" ]; then
                findCmd node_modules/${PACKAGE} >> $FILES
        fi
    done < $PACKAGES
    export FILES
    export SQ="'"
    xargs -P ${NUMCONCURRENT:-1} -r -a  "$PACKAGES" -I[] bash -c '
        PACKAGE="[]"

        RES=$(cat "$FILES" | xargs -r egrep -i "(import|require|loader|plugins|${PACKAGE}).*[\"${SQ}](${PACKAGE}|.?\d+)[\"${SQ}]" | wc -l)

        if [ $RES = 0 ]
        then
            echo -e "UNBENUTZT\t\t $PACKAGE"
        else
            echo -e "BENUTZT ($RES)\t $PACKAGE"
        fi
    '
    [ -f  "$PACKAGES" ] && rm "$PACKAGES"
    [ -f  "$FILES" ] && rm "$FILES"
}

check "dependencies"
check "devDependencies"
check "peerDependencies"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X