Wie verwende ich ausführbare Dateien aus einem Paket, das lokal in node_modules installiert ist?

493

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_modulesund 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 execin 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 -gFlag 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?

typoneerror
quelle
9
Viele Anweisungen, die ich lese, sagen Dinge wie npm install niftycommandund dann niftycommand. Aber das wird niemals funktionieren, wenn Sie nicht ./node_modules/.bin auf Ihrem Weg haben, oder?
Bennett McElwee
2
Hier gibt es eine sehr gute Beschreibung: firstdoit.com/… - Grundsätzlich wird empfohlen, den coffeeBefehl in den npm scriptsAbschnitt "build": "coffee -co target/directory source/directoy", so you can run einzufügen , z. B. npm run build` vom Terminal aus.
Benny Neugebauer
@BennyNeugebauer in der Tat, das ist, was ich in letzter Zeit getan habe, anstatt mit PATH
Typoneerror
12
Verwendung, npxdie mit npm 5.2.0 medium.com/@maybekatz/…
onmyway133

Antworten:

568

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

./node_modules/.bin

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

npm bin

Mit coffeediesem Bash-Konstrukt können Sie eine lokal installierte Binärdatei ausführen, unabhängig davon, wo Sie sich in der Projektverzeichnishierarchie befinden

PATH=$(npm bin):$PATH coffee

Ich habe dies auf npm-exec aliasiert

alias npm-exec='PATH=$(npm bin):$PATH'

Also jetzt kann ich

npm-exec coffee

die richtige Kopie des Kaffees laufen zu lassen, egal wo ich bin

$ pwd
/Users/regular/project1

$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd lib/
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd ~/project2
$ npm-exec which coffee
/Users/regular/project2/node_modules/.bin/coffee
regulär
quelle
17
Sie können sogar noch einen Schritt weiter gehen undalias coffee="npm-exec coffee"
regelmäßig am
6
Die Ausgabe ändert sich, wenn Sie in ein anderes Projekt cd. Es ändert sich nicht, wenn Sie innerhalb eines Projekts eine CD erstellen. npm binDurchsucht 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.
regulärer
11
oh Gott! Muss ich wirklich so etwas tun, damit meine lokalen Module funktionieren? Es ist ziemlich unpraktisch, es einem Team zu erklären! es gibt nichts einfacheres?
Alexian
17
Sie können immer npm-Skripte verwenden, da diese immer zuerst die lokalen Binärdateien durchsuchen. Sie können dort Aliase für jede Ihrer Binärdateien einrichten oder einfach generische Namen wie "build" verwenden.
Joe Zim
6
@philosodad, eigentlich nein, tust du nicht. Das PATHwird 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.
regulärer
410

Schönes Beispiel

Sie müssen nicht mehr manipulieren $PATH!

Ab [email protected] wird npm mit einem npxPaket geliefert , mit dem Sie Befehle von einem lokalen node_modules/.binoder einem zentralen Cache ausführen können .

Einfach ausführen:

$ npx [options] <command>[@version] [command-arg]...

npxÜberprüft standardmäßig, ob <command>in $PATHoder 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 $PATHProgramm 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-installOption angeben.

Für npm < 5.2.0können Sie installieren npxPaket manuell , indem Sie den folgenden Befehl ein :

$ npm install -g npx
Seyeong Jeong
quelle
1
Ich mag es nicht, globale npm-Pakete von Drittanbietern zu installieren, während npmund package.jsonfast die gleiche Funktionalität bietet.
Guneysos
Wenn die Meldung "Pfad muss eine Zeichenfolge sein.
Valeriy
1
Diese Antwort ist gut. Aber ich möchte nur sagen, dass npxes lahm ist. Es hätte sein müssen npm runoder npm execoder so etwas.
William Entriken
@WilliamEntriken Funktioniert aus bestimmten Gründen npm run [my-local-package]nicht auf meinem Ubuntu, obwohl es auf einem Windows-Gerät zu funktionieren schien.
Uhrwerk
97

Verwenden Sie den npm binBefehl, um das Verzeichnis node modules / bin Ihres Projekts abzurufen

$ $(npm bin)/<binary-name> [args]

z.B

$ $(npm bin)/bower install
Jassa
quelle
4
Ich mag diese einfache und generische Lösung. Lässt einen Alias ​​unnötig erscheinen.
Matt Montag,
Scheint die nächstbeste Lösung zu sein, die elegant und sicherer ist als zu tunexport PATH="./node_modules/.bin:$PATH"
Jontsai
1
@ inf3rno der Befehl ist $(npm bin)/jasmine, nicht node $(npm bin)/jasmine(Sie haben es wahrscheinlich herausgefunden, aber für andere geklärt ).
Jassa
5
Keine schlechte Lösung, aber sie läuft nicht auf einer Standard-Windows-Befehlszeile mit $. Das Einfügen in den Abschnitt "package.json-Skripte" ist meiner Meinung nach ein besserer Ansatz, da er kompatibler ist.
Timothy Gonzalez
77

Verwenden npm run[-script] <script name>

Nachdem Sie das bin-Paket mit npm in Ihrem lokalen ./node_modulesVerzeichnis installiert haben , ändern package.jsonSie es <script name>wie folgt:

$ npm install --save learnyounode
$ edit packages.json
>>> in packages.json
...
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "learnyounode": "learnyounode"
},
...
$ npm run learnyounode

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.

jla
quelle
5
Ich fand diesen Ansatz einheitlicher, wenn ich mit mehreren Entwicklern an einem Projekt zu tun habe - er vermeidet die Notwendigkeit, irgendetwas lokal zu konfigurieren ... Sie haben gerade npm installdann Zugriff auf Ihre Entwicklungsabhängigkeiten. Der einzige kleine Nachteil ist, dass Sie npm 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üssen npm start, um Ihren Entwicklungsserver zu starten. Ziemlich cooles Zeug und keine Bash-Güte, also mögen deine Windows-Freunde dich immer noch. :)
jpoveda
1
Das Hinzufügen eines Alias, um $ (npm bin) auf Ihren Pfad zu setzen, ist klug, aber die Tatsache, dass dies für Leute ohne lokale Konfiguration funktioniert, gewinnt mein Herz
Conrad.Dean
12
das braucht mehr upvotes! --npm run learnyounode -- --normal-switches --watch -d *.js
Übergeben Sie Argumente
Ich finde das auch die beste Lösung. Es gibt eine ausführliche Erklärung hier: lostechies.com/derickbailey/2012/04/24/…
adampasz
1
Dies ist, was ich normalerweise mache, aber aus bestimmten Gründen npm run ts-nodefunktioniert es auf einem Ubuntu-Gerät nicht für mich. Ich muss mich nur um npx kümmern.
Uhrwerk
42

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

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

Installation

$ npm install -g npm-run
mächtig
quelle
8
Nicht mehr, siehe npx, auf das oben verwiesen wird
tj
41

Update: Ich empfehle diese Methode nicht mehr, sowohl aus den genannten Sicherheitsgründen als auch nicht zuletzt aus dem neueren npm binBefehl. 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/.binzuerst in Ihren Pfad einfügen:

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

Wenn Sie dies in Ihr Feld einfügen ~/.profile, coffeewird es immer ./node_modules/.bin/coffeeverfügbar sein, andernfalls /usr/local/bin/coffee(oder unter welchem ​​Präfix Sie auch Knotenmodule installieren).

Linus Gustav Larsson Thiel
quelle
1
Das ist wahrscheinlich die beste Lösung. Ich habe auch ein Bash-Skript namens "watch" in meinem Projekt erstellt:./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
typeoneerror
72
Gefahr, Will Robinson! Die Verwendung relativer Pfade in Ihrem $ PATH öffnet eine Sicherheitslücke von der Größe eines Planeten, insbesondere wenn Sie sie als erstes Element ganz vorne platzieren. Wenn das Verzeichnis sind Sie in von allen beschreibbar ist (sagen wir irgendwo in /tmp), jeder Prozess oder Benutzer die Sitzung , indem sie bösartige Versionen von gewöhnlichen Befehle kapern können (wie ls, cpetc.) gibt. Diese können "unsichtbare" Unterschalen erzeugen, die Ihre Passwörter usw. erfassen.
Bestätigen Sie den
funktioniert nur in der Wurzel und an keinen anderen Stellen. das alias npm-exec='PATH=$(npm bin):$PATH'ist glatter.
Oligofren
1
Wie schlimm ist das, wenn Sie es nicht als erstes 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 im npm binVerzeichnis bereits vertraut, unabhängig von der PATHVariable. 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 von npminstallierten Programmen bereits fremden ausführbaren Dateien vertrauen .
Osdiab
Sie können Shell-Tricks mit einem Alias ​​ausführen und den Pfad manuell erstellen. Dies "funktioniert", ist jedoch nicht ganz ideal.
Killscreen
22

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:

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

Dies kann dann wie folgt verwendet werden, ohne Änderungen an Ihrer Umgebung vorzunehmen:

npm-exec r.js <args>
Bob9630
quelle
2
Ich mag das! Ich habe einfach meine Funktion benanntn
jontsai
Das ist toll! Danke für das Teilen. Ich habe unten eine Fischschalenversion hinzugefügt.
LeOn - Han Li
22

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:

 yarn yourCmd

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:

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

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


Wenn Sie ein Skript .scriptsin Ihrem definiert haben package.json:

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

yarn tscwäre gleichbedeutend mit yarn run tscoder npm run tsc:

 yarn tsc
 yarn tsc v0.27.5
 $ tsc
k0pernikus
quelle
14

Update: Wenn Sie auf dem neuesten npm sind (Version> 5.2)

Sie können verwenden:

npx <command>

npxsucht nach dem Befehl im .binVerzeichnis Ihresnode_modules

alte Antwort:

Für Windows

Speichern Sie Folgendes in einer aufgerufenen Datei npm-exec.batund fügen Sie es Ihrer hinzu%PATH%

@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET modules=%%i
"%modules%"\%*

Verwendungszweck

Dann kannst du es gerne benutzen npm-exec <command> <arg0> <arg1> ...

Zum Beispiel

wdioGehen Sie folgendermaßen vor, um die Installation im lokalen Verzeichnis node_modules auszuführen :

npm-exec wdio wdio.conf.js

dh es wird laufen .\node_modules\.bin\wdio wdio.conf.js

Dheeraj Bhaskar
quelle
Dies funktioniert nicht, wenn mehr als ein Argument übergeben wird. ZB npm-exec gulp <some_task>
OK999
@ OK9999 Ich bin sicher, dass einige geringfügige Änderungen das Übergeben von Argumenten ermöglichen (denn wenn Sie es hier übergeben, wird es in "" zitiert). Was ich vorschlage, ist das Kopieren und Einfügen der Gulp-Datei von bin in Ihr Projektstammverzeichnis (einige Änderungen sind an der Datei erforderlich, aber es funktioniert nur, ohne neuen Code usw. zu schreiben)
Dheeraj Bhaskar
Ja, am Ende habe ich das getan. Der Ordner node_modules muss sich in dem Ordner befinden, in dem die Gulpfile vorhanden ist
OK999
6

Ich ziehe es vor, mich nicht auf Shell-Aliase oder ein anderes Paket zu verlassen.

Wenn Sie eine einfache Zeile zu scriptsIhrem Abschnitt hinzufügen package.json, können Sie lokale npm-Befehle wie ausführen

npm run webpack

package.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "webpack": "webpack"
  },
  "devDependencies": {
    "webpack": "^4.1.1",
    "webpack-cli": "^2.0.11"
  }
}
Guneysos
quelle
5

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 ist PATH):

__OLD_PATH=$PATH
function updatePATHForNPM() {
  export PATH=$(npm bin):$__OLD_PATH
}

function node-mode() {
  PROMPT_COMMAND=updatePATHForNPM
}

function node-mode-off() {
  unset PROMPT_COMMAND
  PATH=$__OLD_PATH
}

# Uncomment to enable node-mode by default:
# node-mode

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-modeund node-mode-offsind.

namuol
quelle
4

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:

ng serve

Ich kann dies von der Konsole aus tun:

npx ng serve

Hier ist ein Artikel, den ich über NPX geschrieben habe und der tiefer geht.

Jair Reina
quelle
2

zxc ist wie "bundle exec" für nodejs. Es ähnelt der Verwendung von PATH=$(npm bin):$PATH:

$ npm install -g zxc
$ npm install gulp
$ zxc which gulp
/home/nathan/code/project1/node_modules/.bin/gulp
Nathan
quelle
2

Gleiche @regular's akzeptierte Lösung, aber Fischschalengeschmack

if not contains (npm bin) $PATH
    set PATH (npm bin) $PATH
end
Pionierhimmel
quelle
1

Sie können auch direnv verwenden und die Variable $ PATH nur in Ihrem Arbeitsordner ändern.

$ cat .envrc
> export PATH=$(npm bin):$PATH
Erem
quelle
1

Fügen Sie dieses Skript zu Ihrem hinzu .bashrc. Dann können Sie vor Ort anrufen coffeeoder etwas anderes. Dies ist praktisch für Ihren Laptop, aber verwenden Sie es nicht auf Ihrem Server.

DEFAULT_PATH=$PATH;

add_local_node_modules_to_path(){
  NODE_MODULES='./node_modules/.bin';
  if [ -d $NODE_MODULES ]; then
    PATH=$DEFAULT_PATH:$NODE_MODULES;
  else
    PATH=$DEFAULT_PATH;
  fi
}

cd () {
  builtin cd "$@";
  add_local_node_modules_to_path;
}

add_local_node_modules_to_path;

Hinweis : Dieses Skript erstellt einen Aliase des cdBefehls und cdüberprüft node_modules/.binihn 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 den cdBefehl zu langsam machen.

Tsutomu Kawamura
quelle
1
Verwenden Sie $(npm bin)anstelle von Hardcoding ./node_modules/.bin.
Bfontaine
Hmm, $(npm bin)scheint zu langsam, um mit jedem cdBefehl verwendet zu werden. Ich habe den Code wiederhergestellt und einen Hinweis hinzugefügt.
Tsutomu Kawamura
1

Verwenden Sie für Windows Folgendes:

/* cmd into "node_modules" folder */
"%CD%\.bin\grunt" --version
b3wii
quelle
0

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 :

#!/bin/sh

# Add your local node_modules bin to the path
export PATH="$(npm bin):$PATH"

# execute the rest of the command
exec "$@"

und dann können Sie /binmit diesem Befehl alle ausführbaren Dateien in Ihrem lokalen verwenden:

./setenv.sh <command>
./setenv.sh 6to5-node server.js
./setenv.sh grunt

Wenn Sie scriptsin package.json verwenden, dann:

...,
scripts: {
    'start': './setenv.sh <command>'
}
nkh
quelle
2
Dieses Setenv-Skript ist für package.json-Skripte nicht erforderlich. npm stellt bereits das lokale Verzeichnis node_modules / .bin vor den Pfad, wenn Sie npm run {scripts} ausführen.
Jason Karns
0

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 binSuchen des Verzeichnisses zu verwenden und das Skript nur dann aufzurufen, npm binwenn a package.jsonin einem übergeordneten Element vorhanden ist (aus Gründen der Geschwindigkeit), ist das, was ich mir ausgedacht habe zsh:

find-up () {
  path=$(pwd)
  while [[ "$path" != "" && ! -e "$path/$1" ]]; do
    path=${path%/*}
  done
  echo "$path"
}

precmd() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi
}

Für bashstatt der die Verwendung von precmdHaken, können Sie die Verwendung $PROMPT_COMMANDVariable (Ich habe nicht getestet , aber Sie bekommen die Idee):

__add-node-to-path() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi   
}

export PROMPT_COMMAND="__add-node-to-path"
osdiab
quelle
Das Hinzufügen npm binzum Ende von führt $PATHmö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!
LoganMzz
0

Ich bin ein WindowsBenutzer und das hat bei mir funktioniert:

// First set some variable - i.e. replace is with "xo"
D:\project\root> set xo="./node_modules/.bin/"

// Next, work with it
D:\project\root> %xo%/bower install

Viel Glück.

Akash
quelle
0

Falls Sie verwenden fish shellund $pathaus 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.

### run executables in node_module/.bin directory
function n 
  set -l npmbin (npm bin)   
  set -l argvCount (count $argv)
  switch $argvCount
    case 0
      echo please specify the local node executable as 1st argument
    case 1
      # for one argument, we can eval directly 
      eval $npmbin/$argv
    case '*'
      set --local executable $argv[1]
      # for 2 or more arguments we cannot append directly after the $npmbin/ since the fish will apply each array element after the the start string: $npmbin/arg1 $npmbin/arg2... 
      # This is just how fish interoperate array. 
      set --erase argv[1]
      eval $npmbin/$executable $argv 
  end
end

Jetzt können Sie Folgendes ausführen:

n coffee

oder mehr Argumente wie:

n browser-sync --version

Hinweis: Wenn Sie ein bashBenutzer sind, können Sie mit @ Bob9630-Antworten Bashs nutzen $@, die in nicht verfügbar sind fishshell.

LeOn - Han Li
quelle
-9

Fügen Sie in package.json ein Kaffeeskript mit der spezifischen Version ein, die in jedem Projekt erforderlich ist, normalerweise wie folgt:

"dependencies":{
  "coffee-script": ">= 1.2.0"

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.

almypal
quelle
Ja, ich bin so weit gekommen, wie ich in meiner Frage angegeben habe. Wie rufe ich speziell das in meinem Projekt neben ./node_modules/.bin/coffee auf?
Typoneerror
Wenn Sie npm install mit der Datei package.json im Hauptordner Ihres Projekts ausgeführt haben, sollte sich in diesem Ordner ein Ordner ./node_modules/.bin/coffee befinden. Wenn Sie ./node_modules/coffee-script/bin/coffee verwenden, wird die lokale Version von Kaffee ausgeführt, während nur das Ausführen von Kaffee die globale Installation ausführt. Wenn Sie eine andere Version von Kaffee in einem anderen Pfad in diesem Projektordner installiert haben, können Sie über ./path/to/this/installation/coffee darauf zugreifen.
Almypal
Das hat bei mir nicht funktioniert. Ich versuche, "svgo" zu verwenden, und es funktioniert nur, wenn es global installiert ist. Ich habe es npm install svgogenauso gut versucht wie npm installmit package.json. Beide Methoden wurden "erfolgreich" installiert, aber der Befehl "svgo" ist immer noch nicht verfügbar.
Ryan Wheale
1
Grunt nutzt dies auf clevere Weise, und meiner Meinung nach auch andere Pakete. Zuerst installieren Sie das grunt-cliPaket global, dann installieren Sie in Ihrem Projektverzeichnis eine beliebige (geänderte) Version des gruntPakets. Wenn Sie es ausführen grunt, wird diese lokale Version verwendet.
Bestätigen Sie den