Jak korzystać z plików wykonywalnych z pakietu zainstalowanego lokalnie w module node_modules?

493

Jak korzystać z lokalnej wersji modułu w node.js. Na przykład w mojej aplikacji zainstalowałem skrypt do kawy:

npm install coffee-script

Spowoduje to zainstalowanie ./node_modulesi uruchomienie polecenia kawy ./node_modules/.bin/coffee. Czy istnieje sposób na uruchomienie tego polecenia, gdy jestem w głównym folderze mojego projektu? Chyba szukam czegoś podobnego do bundle execw pakiecie. Zasadniczo chciałbym określić wersję skryptu kawowego, z której powinien korzystać każdy zaangażowany w projekt.

Wiem, że mogę dodać -gflagę, aby zainstalować ją globalnie, aby kawa działała dobrze w dowolnym miejscu, ale co, jeśli chciałbym mieć różne wersje kawy na projekt?

typoneerror
źródło
9
Wiele instrukcji, które czytam, mówią rzeczy takie jak npm install niftycommandwtedy niftycommand. Ale to nigdy nie zadziała, jeśli nie masz ./node_modules/.bin na swojej ścieżce, prawda?
Bennett McElwee,
2
Jest tutaj bardzo dobry napis: firstdoit.com/… - Zasadniczo zaleca się umieszczenie coffeepolecenia w tej npm scriptssekcji, na przykład "build": "coffee -co target/directory source/directoy", so you can run później uruchom kompilację npm z terminala.
Benny Neugebauer
@BennyNeugebauer rzeczywiście, to właśnie robiłem ostatnio zamiast
zadzierać
12
Użyj, npxktóry pochodzi z npm 5.2.0 medium.com/@maybekatz/…
onmyway133

Odpowiedzi:

567

AKTUALIZACJA : Jak wskazuje Seyeong Jeong w swojej odpowiedzi poniżej, ponieważ npm 5.2.0 możesz użyć npx [command], co jest wygodniejsze.

STARA ODPOWIEDŹ dla wersji wcześniejszych niż 5.2.0 :

Problem ze stawianiem

./node_modules/.bin

w twojej ŚCIEŻCE jest to, że działa ona tylko wtedy, gdy bieżący katalog roboczy jest katalogiem głównym struktury katalogu projektu (tj. lokalizacja node_modules)

Niezależnie od katalogu roboczego możesz uzyskać ścieżkę do lokalnie zainstalowanych plików binarnych

npm bin

Aby wykonać lokalnie zainstalowany coffeeplik binarny niezależnie od tego, gdzie jesteś w hierarchii katalogu projektu, możesz użyć tej konstrukcji bash

PATH=$(npm bin):$PATH coffee

Skalowałem to do npm-exec

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

Więc teraz mogę

npm-exec coffee

uruchomić prawidłową kopię kawy bez względu na to, gdzie jestem

$ 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
regularny
źródło
17
można nawet pójść o krok dalej ialias coffee="npm-exec coffee"
regularna
6
Dane wyjściowe zmieniają się po przejściu do innego projektu. Nie zmienia się, gdy wykonujesz cd w projekcie. npm binprzeszukuje łańcuch „katalogów przodków” do cwd w poszukiwaniu katalogu node_modules. Jest to dokładnie pożądane zachowanie, jeśli chcesz używać plików binarnych modułów wymienionych w pakiecie.json projektu.
regularne
11
o Boże! czy naprawdę muszę coś takiego zrobić, aby moje moduły lokalne działały? wyjaśnienie tego zespołowi jest praktycznie niewykonalne! nie ma nic bardziej prostego?
Alexian
17
Zawsze możesz używać skryptów npm, ponieważ zawsze najpierw przeszukują lokalne pliki binarne. Możesz ustawić aliasy dla każdego z twoich plików binarnych lub po prostu użyć nazw ogólnych, takich jak „build”.
Joe Zim
6
@ philosodad, właściwie nie, ty nie. PATHBędzie z powrotem do tego, co było przed wywołaniem polecenia. Ustawienie zmiennej środowiskowej w tym samym wierszu przed uruchomieniem polecenia wpływa tylko na środowisko tego polecenia.
regularny
410

Niezły przykład

Nie musisz $PATHjuż manipulować !

Od [email protected] , npm jest dostarczany z npxpakietem, który pozwala na uruchamianie poleceń z lokalnego node_modules/.binlub centralnego bufora.

Po prostu uruchom:

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

Domyślnie npxsprawdzi, czy <command>istnieje w $PATHlokalnych plikach binarnych projektu, czy też go uruchomi.

Wywołanie, npx <command>gdy <command>nie ma go w twoim $PATHkatalogu, automatycznie zainstaluje dla ciebie pakiet o tej nazwie z rejestru NPM i uruchom go. Gdy to zrobisz, zainstalowany pakiet nie będzie nigdzie w twoich globalsach, więc nie będziesz musiał martwić się o zanieczyszczenie w perspektywie długoterminowej. Możesz temu zapobiec, udostępniając --no-installopcję.

Dla npm < 5.2.0, można zainstalować npxpakiet ręcznie, uruchamiając następującą komendę:

$ npm install -g npx
Seyeong Jeong
źródło
1
Nie lubię instalować globalnych pakietów npm innych firm npmi package.jsonzapewnia prawie taką samą funkcjonalność.
guneysus
Jeśli pojawi się komunikat „Ścieżka musi być łańcuchem. Otrzymano niezdefiniowany”, oto poprawka: github.com/zkat/npx/issues/144#issuecomment-391031816
Valeriy Katkov
1
Ta odpowiedź jest dobra. Ale chcę tylko powiedzieć, że npxjest kiepski. To powinna być npm runlub npm execczy coś.
William Entriken
@WilliamEntriken Z niektórych powodów npm run [my-local-package]nie działa na moim Ubuntu, chociaż wydaje się, że działa na urządzeniu z systemem Windows.
Mechaniczna
97

Użyj npm binpolecenia, aby uzyskać katalog modułów / bin węzła swojego projektu

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

na przykład

$ $(npm bin)/bower install
Jassa
źródło
4
Podoba mi się to proste i ogólne rozwiązanie. Sprawia, że ​​alias wydaje się niepotrzebny.
Matt Montag
Wydaje się być kolejnym najlepszym rozwiązaniem, które jest eleganckie i bezpieczniejsze niż koniecznośćexport PATH="./node_modules/.bin:$PATH"
jontsai
1
@ inf3rno polecenie $(npm bin)/jasminenie jest node $(npm bin)/jasmine(prawdopodobnie wymyśliłeś to, ale wyjaśniłeś innym).
jassa,
5
Nie jest to złe rozwiązanie, ale nie działa ono w standardowym wierszu poleceń systemu Windows za pomocą $. Umieszczenie go w sekcji skryptów package.json to lepsze podejście, ponieważ jest bardziej kompatybilne.
Timothy Gonzalez
77

Posługiwać się npm run[-script] <script name>

Po użyciu npm do zainstalowania pakietu bin w ./node_moduleskatalogu lokalnym , zmodyfikuj, package.jsonaby dodać w <script name>następujący sposób:

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

Byłoby miło, gdyby instalacja npm miała opcję --add-script lub coś, lub gdyby uruchomienie npm działało bez dodawania do bloku skryptów.

jla
źródło
5
Przekonałem się, że to podejście jest bardziej jednolite w kontaktach z wieloma programistami w projekcie - pozwala to uniknąć potrzeby konfigurowania czegokolwiek lokalnie ... właśnie npm installwtedy masz dostęp do swoich zależności programistycznych. Jedynym drobnym minusem jest to, że musisz npm run eslint(lub cokolwiek). Możesz utworzyć skrypt o nazwie „start”, który uruchamia gulp, więc wystarczy wpisać, npm startaby uruchomić serwer deweloperski. Całkiem fajne rzeczy i bez bashu, więc Twoi znajomi z systemu Windows nadal cię lubią. :)
jpoveda
1
dodanie aliasu, aby umieścić $ (npm bin) na swojej ścieżce, jest sprytne, ale fakt, że zadziała to dla osób bez lokalnej konfiguracji,
podbija
12
to wymaga więcej pozytywnych opinii! Przekaż argumenty do swoich skryptów po --:npm run learnyounode -- --normal-switches --watch -d *.js
ptim
Uważam to również za najlepsze rozwiązanie. Szczegółowe wyjaśnienie znajduje się tutaj: lostechies.com/derickbailey/2012/04/24/...
adampasz
1
Do tego zwykle chodzę, ale z pewnych powodów na urządzeniu Ubuntu npm run ts-nodenie działa dla mnie. Będę musiał po prostu ressortować do npx.
Mechaniczna
42

Zastosowanie npm-run.

Z pliku Readme:

npm-run

Znajdź i uruchom lokalne pliki wykonywalne z node_modules

Każdy plik wykonywalny dostępny dla skryptu cyklu życia npm jest dostępny dla npm-run.

Stosowanie

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

Instalacja

$ npm install -g npm-run
Mightyiam
źródło
8
Już nie patrz wyżej wspomniane npx ... stackoverflow.com/a/45164863/3246805
tj.
41

Aktualizacja: Nie polecam już tej metody, zarówno ze względu na wspomniane względy bezpieczeństwa, jak i nowsze npm binpolecenie. Oryginalna odpowiedź poniżej:

Jak się dowiedziałeś, wszystkie lokalnie zainstalowane pliki binarne znajdują się w ./node_modules/.bin. Aby zawsze uruchamiać pliki binarne w tym katalogu zamiast globalnie dostępnych plików binarnych, jeśli są obecne, sugeruję, abyś postawił na ./node_modules/.binpierwszym miejscu swoją ścieżkę:

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

Jeśli umieścisz to w swoim ~/.profile, coffeezawsze będzie ./node_modules/.bin/coffeedostępne, w przeciwnym razie /usr/local/bin/coffee(lub jakikolwiek prefiks, pod którym instalujesz moduły węzłów).

Linus Gustav Larsson Thiel
źródło
1
to chyba najlepsze rozwiązanie. W moim projekcie stworzyłem również skrypt bash o nazwie „watch”:./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
typeoneerror
72
Niebezpieczeństwo, Will Robinson! Użycie względnych ścieżek w $ PATH otwiera dziurę w zabezpieczeniach wielkości planety, szczególnie jeśli umieścisz je na pierwszym planie. Jeśli jesteś w katalogu jest zapisywalny przez wszystkich (powiedzmy gdzieś /tmp), każdy proces lub użytkownik może przechwycić sesję przez wprowadzenie złośliwych wersje zwykłych poleceń (jak ls, cpetc.) tam. Mogą one odradzać „niewidzialne” podpowłoki przechwytujące hasła itp.
ack
będzie działać tylko w katalogu głównym, a nie w innych miejscach. alias npm-exec='PATH=$(npm bin):$PATH'jest płaszcz.
oligofren
1
Jak źle to jest, jeśli nie umieścisz go jako pierwszej rzeczy PATH, ale ostatniej (używając $(npm bin)formularza)? więc nie mogą nadpisać twoich istniejących rzeczy, a ty ufasz plikom wykonywalnym w npm binkatalogu już bez względu na PATHvar; czy model zagrożenia polega na tym, że a) ktoś złośliwy uzyskuje dostęp do twojego systemu plików, b) dodaje pliki wykonywalne o nazwach zbliżonych do tych narzędzi systemowych, i c) mylisz się? Próbujesz zrozumieć scenariusze, które sprawiają, że to źle, biorąc pod uwagę, że ufasz już zagranicznym plikom wykonywalnym podczas korzystania z npmprogramów zainstalowanych.
osdiab
Możesz wykonywać sztuczki z powłoką za pomocą aliasu, a także ręcznie, a to „działa”, ale nie jest to idealne rozwiązanie.
killscreen,
22

Rozwiązanie PATH ma problem polegający na tym, że jeśli $ (npm bin) jest umieszczony w twoim .profile / .bashrc / etc, jest on oceniany raz i na zawsze jest ustawiany w jakimkolwiek katalogu, w którym najpierw oceniono ścieżkę. Jeśli zamiast tego zmodyfikujesz bieżącą ścieżkę, to za każdym razem, gdy uruchomisz skrypt, ścieżka się powiększy.

Aby obejść te problemy, utworzyłem funkcję i wykorzystałem ją. Nie modyfikuje środowiska i jest prosty w użyciu:

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

Można to następnie wykorzystać w następujący sposób bez wprowadzania zmian w środowisku:

npm-exec r.js <args>
Bob9630
źródło
2
Lubię to! Po prostu nazwałem swoją funkcjęn
jontsai
To jest świetne! Dzięki za udostępnienie. Poniżej dodałem wersję skorupy ryby.
LeOn - Han Li
22

Jeśli chcesz zachować npm, npx powinien zrobić to, czego potrzebujesz.


Jeśli przejście na przędzę (zastąpienie npm przez facebook) jest dla Ciebie opcją, możesz zadzwonić:

 yarn yourCmd

skrypty w pakiecie.json będą miały pierwszeństwo, jeśli żaden nie zostanie znaleziony, zajrzy do ./node_modules/.bin/folderu.

Wyświetla również to, co uruchomił:

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

Więc nie musisz konfigurować skryptów dla każdego polecenia w swoim package.json.


Jeśli masz skrypt zdefiniowany w .scriptsswoim package.json:

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

yarn tscbyłoby równoważne yarn run tsclub npm run tsc:

 yarn tsc
 yarn tsc v0.27.5
 $ tsc
k0pernikus
źródło
14

aktualizacja: jeśli korzystasz z najnowszej wersji npm (wersja> 5.2)

Możesz użyć:

npx <command>

npxszuka polecenia w .binkatalogu twojegonode_modules

stara odpowiedź:

Dla Windowsa

Zapisz następujące elementy w pliku o nazwie npm-exec.bati dodaj go do swojego%PATH%

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

Stosowanie

Następnie możesz go użyć jak npm-exec <command> <arg0> <arg1> ...

Na przykład

Aby wykonać wdioinstalację zainstalowaną w lokalnym katalogu modułów_węzła, wykonaj:

npm-exec wdio wdio.conf.js

tj. będzie działać .\node_modules\.bin\wdio wdio.conf.js

Dheeraj Bhaskar
źródło
To nie działa podczas przekazywania więcej niż 1 argumentu. Np. Npm-exec gulp <some_task>
OK999
@ OK9999 Jestem pewien, że jakaś niewielka modyfikacja pozwoli na przekazywanie argumentów (ponieważ kiedy ją tutaj przekazujesz, pojawia się w cudzysłowie ""); Sugeruję, aby skopiować i wkleić plik gulp z bin do katalogu głównego projektu (potrzebne są pewne modyfikacje pliku, ale będzie on działał bez pisania nowego kodu itp.)
Dheeraj Bhaskar,
Tak, ostatecznie to zrobiłem. Folder node_modules musi znajdować się w folderze, w którym istnieje
plik gulp
6

Wolę nie polegać na aliasach powłoki lub innym pakiecie.

Dodając prosty wiersz do scriptssekcji package.json, możesz uruchamiać lokalne polecenia npm

npm run webpack

pakiet.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "webpack": "webpack"
  },
  "devDependencies": {
    "webpack": "^4.1.1",
    "webpack-cli": "^2.0.11"
  }
}
guneysus
źródło
5

Jeśli chcesz, aby zmienna PATH poprawnie aktualizowała się w oparciu o bieżący katalog roboczy, dodaj to na końcu swojego .bashrcekwiwalentu (lub po cokolwiek, co definiuje 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

Może to dodawać krótkie opóźnienie za każdym razem, gdy zostanie wyświetlony monit bash (w zależności od rozmiaru projektu, najprawdopodobniej), więc domyślnie jest wyłączony.

Można włączyć i wyłączyć go w terminalu, uruchamiając node-modei node-mode-offodpowiednio.

namuol
źródło
4

Zawsze korzystałem z tego samego podejścia co @ guneysus, aby rozwiązać ten problem, czyli tworzenie skryptu w pliku package.json i używanie go z uruchomioną nazwą skryptową npm.

Jednak w ostatnich miesiącach używam npx i uwielbiam to.

Na przykład pobrałem projekt Angular i nie chciałem instalować Angular CLI na całym świecie. Tak więc, z zainstalowanym npx, zamiast używać globalnego polecenia kątowego cli (jeśli go zainstalowałem) w następujący sposób:

ng serve

Mogę to zrobić z konsoli:

npx ng serve

Oto artykuł, który napisałem o NPX i który zagłębia się w to.

Jair Reina
źródło
2

zxc jest jak „bundle exec” dla nodejs. Jest podobny do używania PATH=$(npm bin):$PATH:

$ npm install -g zxc
$ npm install gulp
$ zxc which gulp
/home/nathan/code/project1/node_modules/.bin/gulp
Nathan
źródło
2

Akceptowane to samo @regular, ale smak rybiej skorupy

if not contains (npm bin) $PATH
    set PATH (npm bin) $PATH
end
Pioneer Skies
źródło
1

Możesz także użyć direnv i zmienić zmienną $ PATH tylko w folderze roboczym.

$ cat .envrc
> export PATH=$(npm bin):$PATH
Erem
źródło
1

Dodaj ten skrypt do swojego .bashrc. Następnie możesz zadzwonić coffeelub zadzwonić lokalnie. Jest to przydatne dla laptopa, ale nie używaj go na serwerze.

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;

Uwaga : ten skrypt tworzy alias cdpolecenia, a po każdym jego wywołaniu cdsprawdza node_modules/.bini dodaje go do twojego $PATH.

uwaga 2 : możesz zmienić trzecią linię na NODE_MODULES=$(npm bin);. Ale to spowodowałoby, że cddowodzenie byłoby zbyt wolne.

Tsutomu Kawamura
źródło
1
Użyj $(npm bin)zamiast na stałe ./node_modules/.bin.
bfontaine,
Hmm, $(npm bin)wydaje się zbyt wolny, by używać go z każdym cdpoleceniem. Przywróciłem kod i dodałem notatkę.
Tsutomu Kawamura
1

W systemie Windows użyj tego:

/* cmd into "node_modules" folder */
"%CD%\.bin\grunt" --version
b3wii
źródło
0

Napotkałem ten sam problem i szczególnie nie lubię używać aliasów (jak sugerują regularni ), a jeśli ich też nie lubisz, oto inne obejście, którego używam, najpierw musisz utworzyć mały skrypt wykonywalny bash, powiedz 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 "$@"

a następnie możesz użyć dowolnego pliku wykonywalnego w lokalnym /binza pomocą tego polecenia:

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

Jeśli używasz scriptsw package.json:

...,
scripts: {
    'start': './setenv.sh <command>'
}
nkh
źródło
2
ten skrypt setenv nie jest konieczny dla skryptów package.json. npm przygotowuje już lokalny katalog node_modules / .bin do ścieżki dla ciebie podczas wykonywania npm run {scripts}.
jasonkarns
0

Chciałbym wiedzieć, czy to niepewny / zły pomysł, ale po odrobinie zastanowienia nie widzę tutaj problemu:

Modyfikując niepewne rozwiązanie Linusa, aby dodać go na końcu, używając npm bindo znalezienia katalogu, i uruchamiając skrypt tylko npm binwtedy, gdy a package.jsonjest obecny w rodzicu (dla szybkości), oto co wymyśliłem 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
}

Ponieważ bashzamiast używać precmdhaka, możesz użyć $PROMPT_COMMANDzmiennej (nie testowałem tego, ale masz pomysł):

__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
źródło
Dodanie npm bindo końca $PATHmoże nie wykonać tego, czego oczekuje użytkownik: w zasadzie inny plik wykonywalny, ale bardziej prawdopodobnie pakiet zainstalowany globalnie z inną wersją!
LoganMzz,
0

Jestem Windowsużytkownikiem i właśnie to działało dla mnie:

// 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

Powodzenia.

Akash
źródło
0

Jeśli używasz fish shelli nie chcesz dodawać do $pathze względów bezpieczeństwa. Możemy dodać poniższą funkcję do uruchamiania plików wykonywalnych węzła lokalnego.

### 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

Teraz możesz uruchomić takie rzeczy jak:

n coffee

lub więcej argumentów takich jak:

n browser-sync --version

Uwaga: jeśli jesteś bashużytkownikiem, to odpowiedzi @ Bob9630 są dobrym sposobem na skorzystanie z bash $@, który nie jest dostępny w fishshell.

LeOn - Han Li
źródło
-9

Dołącz skrypt kawy w pakiecie.json z określoną wersją wymaganą w każdym projekcie, zwykle tak:

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

Następnie uruchom npm install, aby zainstalować zależności w każdym projekcie. Spowoduje to zainstalowanie określonej wersji skryptu do kawy, która będzie dostępna lokalnie dla każdego projektu.

almypal
źródło
tak, dotarłem tak daleko, jak powiedziałem w moim pytaniu. jak konkretnie wywołać ten w moim projekcie poza ./node_modules/.bin/coffee?
typeoneerror
Jeśli uruchomiłeś npm install z pakietem.json w głównym folderze projektu, powinieneś mieć folder ./node_modules/.bin/coffee. Użycie ./node_modules/coffee-script/bin/coffee uruchomi lokalną wersję kawy, a sama kawa uruchomi globalną instalację. Jeśli masz inną wersję kawy zainstalowaną w innej ścieżce w tym folderze projektu, możesz uzyskać do niej dostęp, używając ./path/to/this/installation/coffee.
almypal
To mi nie zadziałało. Próbuję użyć „svgo” i działa ono tylko wtedy, gdy jest zainstalowane globalnie. Próbowałem npm install svgotak dobrze, jak npm installz package.json. Obie metody zostały zainstalowane „pomyślnie”, ale polecenie „svgo” jest nadal niedostępne.
Ryan Wheale,
1
Grunt używa tego w sprytny sposób, a IMHO tak samo powinno robić inne pakiety. Najpierw zainstaluj grunt-clipakiet globalnie, następnie w katalogu projektu zainstaluj dowolną (zmodyfikowaną) wersję gruntpakietu, a następnie po uruchomieniu gruntużyje tej wersji lokalnej.
ack