741 Stimmen

Wie kann man ausführbare Dateien aus einem lokal installierten Paket in node_modules verwenden?

Wie verwende ich eine lokale Version eines Moduls in node.js . In meiner App habe ich zum Beispiel coffee-script installiert:

npm install coffee-script

Dies installiert es in ./node_modules und der Kaffee-Befehl ist in ./node_modules/.bin/coffee . Gibt es eine Möglichkeit, diesen Befehl auszuführen, wenn ich mich im Hauptordner meines Projekts befinde? Ich denke, ich suche nach etwas Ähnlichem wie bundle exec im Bündler. Im Grunde möchte ich eine Version von coffee-script festlegen, die alle am Projekt Beteiligten verwenden sollen.

Ich weiß, ich kann die -g Flagge, um es global zu installieren, so dass Coffee überall gut funktioniert, aber was ist, wenn ich verschiedene Versionen von Coffee pro Projekt haben möchte?

45voto

Linus Thiel Punkte 37466

Aktualisierung: Ich empfehle diese Methode nicht mehr, sowohl aus den erwähnten Sicherheitsgründen als auch nicht zuletzt wegen der neueren npm bin Befehl. Originalantwort unten:

Wie Sie herausgefunden haben, befinden sich alle lokal installierten Binärdateien in ./node_modules/.bin . Um die Binärdateien immer in diesem Verzeichnis und nicht in den global verfügbaren Binärdateien, falls vorhanden, auszuführen, schlage ich vor, dass Sie ./node_modules/.bin der erste auf Ihrem Weg:

export PATH="./node_modules/.bin:$PATH"

Wenn Sie dies in Ihren ~/.profile , coffee wird immer ./node_modules/.bin/coffee falls vorhanden, sonst /usr/local/bin/coffee (oder das Präfix, unter dem Sie die Knotenmodule installieren).

43voto

mightyiam Punkte 2495

Verwenden Sie npm-run .

Aus der Readme-Datei:

npm-run

Lokale ausführbare Dateien aus node_modules finden und ausführen

Jede ausführbare Datei, die für ein npm-Lifecycle-Skript verfügbar ist, ist auch für npm-run .

Verwendung

$ npm install mocha # mocha installed in ./node_modules
$ npm-run mocha test/* # uses locally installed mocha executable 

Einrichtung

$ npm install -g npm-run

29voto

ssc-hrep3 Punkte 14176

TL;DR: Verwendung npm exec con npm@>=7 .


En npx Befehl, der in anderen Antworten erwähnt wurde, wurde komplett umgeschrieben in npm@7 die standardmäßig mit node@15 und kann installiert werden auf node@>=10 . Die Umsetzung ist nun gleich der neu eingeführten npm exec der ähnlich, aber nicht gleich ist wie der vorherige Befehl npx Befehlsimplementierung.

Ein Unterschied ist z.B., dass es immer interaktiv fragt, ob eine Abhängigkeit heruntergeladen werden soll, wenn sie noch nicht installiert ist (kann auch mit den Parametern überschrieben werden --yes o --no ).

Hier ist ein Beispiel für npm exec . Die Doppelstriche ( -- ) trennt die npm exec Parameter aus den eigentlichen Befehlsparametern:

npm exec --no -- jest --coverage

Siehe auch die aktualisierte, offizielle Dokumentation zu npm exec .

25voto

k0pernikus Punkte 51058

Wenn Sie npm behalten wollen, dann npx sollte das tun, was Sie brauchen.


Wenn der Wechsel zu yarn (ein npm-Ersatz von facebook) für Sie eine Option ist, dann können Sie anrufen:

 yarn yourCmd

Skripte in der package.json haben Vorrang, wenn keine gefunden werden, wird in der ./node_modules/.bin/ Ordner.

Sie gibt auch aus, was sie ausgeführt hat:

$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"

Sie müssen also nicht für jeden Befehl Skripte in Ihrem package.json .


Wenn Sie ein Skript definiert haben unter .scripts in Ihrem package.json :

"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first

yarn tsc wäre gleichbedeutend mit yarn run tsc o npm run tsc :

 yarn tsc
 yarn tsc v0.27.5
 $ tsc

23voto

Bob9630 Punkte 945

Die PATH-Lösung hat das Problem, dass, wenn $(npm bin) in Ihrem .profile/.bashrc/etc platziert ist, es einmal ausgewertet wird und für immer auf das Verzeichnis gesetzt wird, in dem der Pfad zuerst ausgewertet wurde. Wenn Sie stattdessen den aktuellen Pfad ändern, wächst der Pfad jedes Mal, wenn Sie das Skript ausführen.

Um diese Probleme zu umgehen, habe ich eine Funktion erstellt und diese verwendet. Sie verändert Ihre Umgebung nicht und ist einfach zu verwenden:

function npm-exec {
   $(npm bin)/$@  
}

Diese kann dann wie folgt verwendet werden, ohne dass Änderungen an Ihrer Umgebung vorgenommen werden müssen:

npm-exec r.js <args>

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