Wie verwende ich eine lokale Version eines Moduls in node.js
. In meiner App habe ich beispielsweise ein Kaffeeskript installiert:
npm install coffee-script
Dies installiert es in ./node_modules
und der Kaffeebefehl ist in ./node_modules/.bin/coffee
. Gibt es eine Möglichkeit, diesen Befehl auszuführen, wenn ich mich im Hauptordner meines Projekts befinde? Ich suche wohl etwas ähnliches wie bundle exec
in Bundler. Grundsätzlich möchte ich eine Version des Kaffeeskripts angeben, die jeder, der an dem Projekt beteiligt ist, verwenden sollte.
Ich weiß, dass ich das -g
Flag hinzufügen kann , um es global zu installieren, damit Kaffee überall gut funktioniert, aber was ist, wenn ich pro Projekt verschiedene Versionen von Kaffee haben möchte?
node.js
coffeescript
npm
node-modules
typoneerror
quelle
quelle
npm install niftycommand
und dannniftycommand
. Aber das wird niemals funktionieren, wenn Sie nicht ./node_modules/.bin auf Ihrem Weg haben, oder?coffee
Befehl in dennpm scripts
Abschnitt"build": "coffee -co target/directory source/directoy", so you can run
einzufügen , z. B. npm run build` vom Terminal aus.npx
die mitnpm 5.2.0
medium.com/@maybekatz/…Antworten:
UPDATE : Wie Seyeong Jeong in der Antwort unten ausführt, können Sie seit npm 5.2.0 verwenden
npx [command]
, was bequemer ist.ALTE ANTWORT für Versionen vor 5.2.0 :
Das Problem beim Putten
in Ihren PFAD ist, dass es nur funktioniert, wenn Ihr aktuelles Arbeitsverzeichnis das Stammverzeichnis Ihrer Projektverzeichnisstruktur ist (dh der Speicherort von
node_modules
)Unabhängig von Ihrem Arbeitsverzeichnis können Sie den Pfad lokal installierter Binärdateien mit abrufen
Mit
coffee
diesem Bash-Konstrukt können Sie eine lokal installierte Binärdatei ausführen, unabhängig davon, wo Sie sich in der Projektverzeichnishierarchie befindenIch habe dies auf npm-exec aliasiert
Also jetzt kann ich
die richtige Kopie des Kaffees laufen zu lassen, egal wo ich bin
quelle
alias coffee="npm-exec coffee"
npm bin
Durchsucht die Kette der 'Vorfahrenverzeichnisse' im cwd nach einem Verzeichnis node_modules. Dies ist genau das gewünschte Verhalten, wenn Sie speziell die Binärdateien der Module verwenden möchten, die in der package.json des Projekts aufgeführt sind.PATH
wird wieder so sein, wie es vor dem Befehlsaufruf war. Das Festlegen einer Umgebungsvariablen in derselben Zeile vor dem Ausführen eines Befehls wirkt sich nur auf die Umgebung dieses Befehls aus.Sie müssen nicht mehr manipulieren
$PATH
!Ab [email protected] wird npm mit einem
npx
Paket geliefert , mit dem Sie Befehle von einem lokalennode_modules/.bin
oder einem zentralen Cache ausführen können .Einfach ausführen:
npx
Überprüft standardmäßig, ob<command>
in$PATH
oder in den lokalen Projekt-Binärdateien vorhanden ist, und führt dies aus.npx <command>
Wenn Sie anrufen, wenn dies<command>
noch nicht in Ihrem$PATH
Programm enthalten ist, wird automatisch ein Paket mit diesem Namen aus der NPM-Registrierung für Sie installiert und aufgerufen. Wenn dies erledigt ist, befindet sich das installierte Paket nirgendwo in Ihrer Welt, sodass Sie sich langfristig keine Sorgen mehr über Umweltverschmutzung machen müssen. Sie können dieses Verhalten verhindern, indem Sie eine--no-install
Option angeben.Für
npm < 5.2.0
können Sie installierennpx
Paket manuell , indem Sie den folgenden Befehl ein :quelle
npm
undpackage.json
fast die gleiche Funktionalität bietet.npx
es lahm ist. Es hätte sein müssennpm run
odernpm exec
oder so etwas.npm run [my-local-package]
nicht auf meinem Ubuntu, obwohl es auf einem Windows-Gerät zu funktionieren schien.Verwenden Sie den
npm bin
Befehl, um das Verzeichnis node modules / bin Ihres Projekts abzurufenz.B
quelle
export PATH="./node_modules/.bin:$PATH"
$(npm bin)/jasmine
, nichtnode $(npm bin)/jasmine
(Sie haben es wahrscheinlich herausgefunden, aber für andere geklärt ).Verwenden
npm run[-script] <script name>
Nachdem Sie das bin-Paket mit npm in Ihrem lokalen
./node_modules
Verzeichnis installiert haben , ändernpackage.json
Sie es<script name>
wie folgt:Es wäre schön, wenn die npm-Installation eine Option --add-script oder so hätte oder wenn die Ausführung von npm funktionieren würde, ohne den Skriptblock zu erweitern.
quelle
npm install
dann Zugriff auf Ihre Entwicklungsabhängigkeiten. Der einzige kleine Nachteil ist, dass Sienpm run eslint
(oder was auch immer) müssen. Sie können ein Skript namens "start" erstellen, das gulp ausführt, sodass Sie nur eingeben müssennpm start
, um Ihren Entwicklungsserver zu starten. Ziemlich cooles Zeug und keine Bash-Güte, also mögen deine Windows-Freunde dich immer noch. :)--
npm run learnyounode -- --normal-switches --watch -d *.js
npm run ts-node
funktioniert es auf einem Ubuntu-Gerät nicht für mich. Ich muss mich nur um npx kümmern.Verwenden Sie
npm-run
.Aus der Readme:
npm-run
Suchen und Ausführen lokaler ausführbarer Dateien aus node_modules
Jede ausführbare Datei, die für ein npm-Lebenszyklus-Skript verfügbar ist, steht für zur Verfügung
npm-run
.Verwendungszweck
Installation
quelle
Update: Ich empfehle diese Methode nicht mehr, sowohl aus den genannten Sicherheitsgründen als auch nicht zuletzt aus dem neueren
npm bin
Befehl. Ursprüngliche Antwort unten:Wie Sie herausgefunden haben, befinden sich alle lokal installierten Binärdateien in
./node_modules/.bin
. Um Binärdateien immer in diesem Verzeichnis anstatt global verfügbarer Binärdateien auszuführen, sollten Sie, falls vorhanden,./node_modules/.bin
zuerst in Ihren Pfad einfügen:Wenn Sie dies in Ihr Feld einfügen
~/.profile
,coffee
wird es immer./node_modules/.bin/coffee
verfügbar sein, andernfalls/usr/local/bin/coffee
(oder unter welchem Präfix Sie auch Knotenmodule installieren).quelle
./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
/tmp
), jeder Prozess oder Benutzer die Sitzung , indem sie bösartige Versionen von gewöhnlichen Befehle kapern können (wiels
,cp
etc.) gibt. Diese können "unsichtbare" Unterschalen erzeugen, die Ihre Passwörter usw. erfassen.alias npm-exec='PATH=$(npm bin):$PATH'
ist glatter.PATH
, sondern als letztes (mithilfe des$(npm bin)
Formulars) eingeben? Sie können also Ihre vorhandenen Inhalte nicht überschreiben, und Sie hätten den ausführbaren Dateien imnpm bin
Verzeichnis bereits vertraut, unabhängig von derPATH
Variable. Wäre das Bedrohungsmodell, dass a) jemand, der böswillig ist, Zugriff auf Ihr Dateisystem erhält, b) ausführbare Dateien mit Namen hinzufügt, die diesen Systemtools nahe kommen, und c) Sie falsch eingeben? Versuchen Sie, Szenarien zu verstehen, die dies schlecht machen, da Sie bei der Verwendung vonnpm
installierten Programmen bereits fremden ausführbaren Dateien vertrauen .Die PATH-Lösung hat das Problem, dass $ (npm bin), wenn es in Ihrem .profile / .bashrc / etc platziert ist, einmal ausgewertet wird und für immer auf das Verzeichnis festgelegt wird, in dem der Pfad zuerst ausgewertet wurde. Wenn Sie stattdessen den aktuellen Pfad ändern, dann Jedes Mal, wenn Sie das Skript ausführen, wächst Ihr Pfad.
Um diese Probleme zu umgehen, habe ich eine Funktion erstellt und diese verwendet. Es ändert Ihre Umgebung nicht und ist einfach zu bedienen:
Dies kann dann wie folgt verwendet werden, ohne Änderungen an Ihrer Umgebung vorzunehmen:
quelle
n
Wenn Sie npm behalten möchten, sollte npx das tun, was Sie brauchen.
Wenn Sie auf Garn umsteigen möchten (ein npm-Ersatz durch Facebook), können Sie anrufen:
Skripte in der Datei package.json haben Vorrang. Wenn keine gefunden werden, wird sie im
./node_modules/.bin/
Ordner angezeigt .Es gibt auch aus, was es lief:
Sie müssen also nicht für jeden Befehl in Ihrem Skript Skripte einrichten
package.json
.Wenn Sie ein Skript
.scripts
in Ihrem definiert habenpackage.json
:yarn tsc
wäre gleichbedeutend mityarn run tsc
odernpm run tsc
:quelle
Update: Wenn Sie auf dem neuesten npm sind (Version> 5.2)
Sie können verwenden:
npx
sucht nach dem Befehl im.bin
Verzeichnis Ihresnode_modules
alte Antwort:
Für Windows
Speichern Sie Folgendes in einer aufgerufenen Datei
npm-exec.bat
und fügen Sie es Ihrer hinzu%PATH%
Verwendungszweck
Dann kannst du es gerne benutzen
npm-exec <command> <arg0> <arg1> ...
Zum Beispiel
wdio
Gehen Sie folgendermaßen vor, um die Installation im lokalen Verzeichnis node_modules auszuführen :dh es wird laufen
.\node_modules\.bin\wdio wdio.conf.js
quelle
Ich ziehe es vor, mich nicht auf Shell-Aliase oder ein anderes Paket zu verlassen.
Wenn Sie eine einfache Zeile zu
scripts
Ihrem Abschnitt hinzufügenpackage.json
, können Sie lokale npm-Befehle wie ausführennpm run webpack
package.json
quelle
Wenn Sie möchten, dass Ihre PATH-Variable basierend auf Ihrem aktuellen Arbeitsverzeichnis korrekt aktualisiert wird, fügen Sie dies am Ende Ihres
.bashrc
Äquivalents hinzu (oder nach allem, was definiert istPATH
):Dies kann zu einer kurzen Verzögerung führen, wenn die Bash-Eingabeaufforderung gerendert wird (abhängig von der Größe Ihres Projekts, höchstwahrscheinlich). Daher ist sie standardmäßig deaktiviert.
Sie können es in Ihrem Terminal aktivieren und deaktivieren , indem Sie
node-mode
undnode-mode-off
sind.quelle
Ich habe immer den gleichen Ansatz wie @guneysus verwendet, um dieses Problem zu lösen. Dabei wird ein Skript in der Datei package.json erstellt und mit npm run script-name ausgeführt.
In den letzten Monaten habe ich jedoch npx verwendet und ich liebe es.
Ich habe beispielsweise ein Angular-Projekt heruntergeladen und wollte die Angular-CLI nicht global installieren. Also, mit npx installiert, anstatt den globalen Winkel cli Befehl (wenn ich ihn installiert hatte) wie folgt zu verwenden:
Ich kann dies von der Konsole aus tun:
Hier ist ein Artikel, den ich über NPX geschrieben habe und der tiefer geht.
quelle
zxc ist wie "bundle exec" für nodejs. Es ähnelt der Verwendung von
PATH=$(npm bin):$PATH
:quelle
Gleiche @regular's akzeptierte Lösung, aber Fischschalengeschmack
quelle
Sie können auch direnv verwenden und die Variable $ PATH nur in Ihrem Arbeitsordner ändern.
quelle
Fügen Sie dieses Skript zu Ihrem hinzu
.bashrc
. Dann können Sie vor Ort anrufencoffee
oder etwas anderes. Dies ist praktisch für Ihren Laptop, aber verwenden Sie es nicht auf Ihrem Server.Hinweis : Dieses Skript erstellt einen Aliase des
cd
Befehls undcd
überprüftnode_modules/.bin
ihn nach jedem Aufruf und fügt ihn Ihrem hinzu$PATH
.note2 : Sie können die dritte Zeile in ändern
NODE_MODULES=$(npm bin);
. Aber das würde dencd
Befehl zu langsam machen.quelle
$(npm bin)
anstelle von Hardcoding./node_modules/.bin
.$(npm bin)
scheint zu langsam, um mit jedemcd
Befehl verwendet zu werden. Ich habe den Code wiederhergestellt und einen Hinweis hinzugefügt.Verwenden Sie für Windows Folgendes:
quelle
Ich bin auf dasselbe Problem gestoßen, und ich mag es nicht besonders, Aliase zu verwenden (wie von regulären empfohlen). Wenn Sie sie auch nicht mögen, dann ist hier eine andere Problemumgehung, die ich verwende. Sie müssen zuerst ein winziges ausführbares Bash-Skript erstellen. sag setenv.sh :
und dann können Sie
/bin
mit diesem Befehl alle ausführbaren Dateien in Ihrem lokalen verwenden:Wenn Sie
scripts
in package.json verwenden, dann:quelle
Ich würde gerne wissen, ob dies eine unsichere / schlechte Idee ist, aber nachdem ich ein wenig darüber nachgedacht habe, sehe ich hier kein Problem:
Das Ändern der unsicheren Lösung von Linus, um sie am Ende hinzuzufügen, das
npm bin
Suchen des Verzeichnisses zu verwenden und das Skript nur dann aufzurufen,npm bin
wenn apackage.json
in einem übergeordneten Element vorhanden ist (aus Gründen der Geschwindigkeit), ist das, was ich mir ausgedacht habezsh
:Für
bash
statt der die Verwendung vonprecmd
Haken, können Sie die Verwendung$PROMPT_COMMAND
Variable (Ich habe nicht getestet , aber Sie bekommen die Idee):quelle
npm bin
zum Ende von führt$PATH
möglicherweise nicht das aus, was der Benutzer erwartet: im Grunde eine andere ausführbare Datei, aber wahrscheinlich ein global installiertes Paket mit einer anderen Version!Ich bin ein
Windows
Benutzer und das hat bei mir funktioniert:Viel Glück.
quelle
Falls Sie verwenden
fish shell
und$path
aus Sicherheitsgründen nichts hinzufügen möchten . Wir können die folgende Funktion hinzufügen, um ausführbare Dateien für lokale Knoten auszuführen.Jetzt können Sie Folgendes ausführen:
n coffee
oder mehr Argumente wie:
n browser-sync --version
Hinweis: Wenn Sie ein
bash
Benutzer sind, können Sie mit @ Bob9630-Antworten Bashs nutzen$@
, die in nicht verfügbar sindfishshell
.quelle
Fügen Sie in package.json ein Kaffeeskript mit der spezifischen Version ein, die in jedem Projekt erforderlich ist, normalerweise wie folgt:
Führen Sie dann npm install aus, um Abhängigkeiten in jedem Projekt zu installieren. Dadurch wird die angegebene Version des Kaffeeskripts installiert, auf die jedes Projekt lokal zugreifen kann.
quelle
npm install svgo
genauso gut versucht wienpm install
mit package.json. Beide Methoden wurden "erfolgreich" installiert, aber der Befehl "svgo" ist immer noch nicht verfügbar.grunt-cli
Paket global, dann installieren Sie in Ihrem Projektverzeichnis eine beliebige (geänderte) Version desgrunt
Pakets. Wenn Sie es ausführengrunt
, wird diese lokale Version verwendet.