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_modules
i 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 exec
w pakiecie. Zasadniczo chciałbym określić wersję skryptu kawowego, z której powinien korzystać każdy zaangażowany w projekt.
Wiem, że mogę dodać -g
flagę, 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?
node.js
coffeescript
npm
node-modules
typoneerror
źródło
źródło
npm install niftycommand
wtedyniftycommand
. Ale to nigdy nie zadziała, jeśli nie masz ./node_modules/.bin na swojej ścieżce, prawda?coffee
polecenia w tejnpm scripts
sekcji, na przykład"build": "coffee -co target/directory source/directoy", so you can run
później uruchom kompilację npm z terminala.npx
który pochodzi znpm 5.2.0
medium.com/@maybekatz/…Odpowiedzi:
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
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
Aby wykonać lokalnie zainstalowany
coffee
plik binarny niezależnie od tego, gdzie jesteś w hierarchii katalogu projektu, możesz użyć tej konstrukcji bashSkalowałem to do npm-exec
Więc teraz mogę
uruchomić prawidłową kopię kawy bez względu na to, gdzie jestem
źródło
alias coffee="npm-exec coffee"
npm bin
przeszukuje ł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.PATH
Bę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.Nie musisz
$PATH
już manipulować !Od [email protected] , npm jest dostarczany z
npx
pakietem, który pozwala na uruchamianie poleceń z lokalnegonode_modules/.bin
lub centralnego bufora.Po prostu uruchom:
Domyślnie
npx
sprawdzi, czy<command>
istnieje w$PATH
lokalnych plikach binarnych projektu, czy też go uruchomi.Wywołanie,
npx <command>
gdy<command>
nie ma go w twoim$PATH
katalogu, 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-install
opcję.Dla
npm < 5.2.0
, można zainstalowaćnpx
pakiet ręcznie, uruchamiając następującą komendę:źródło
npm
ipackage.json
zapewnia prawie taką samą funkcjonalność.npx
jest kiepski. To powinna byćnpm run
lubnpm exec
czy coś.npm run [my-local-package]
nie działa na moim Ubuntu, chociaż wydaje się, że działa na urządzeniu z systemem Windows.Użyj
npm bin
polecenia, aby uzyskać katalog modułów / bin węzła swojego projektuna przykład
źródło
export PATH="./node_modules/.bin:$PATH"
$(npm bin)/jasmine
nie jestnode $(npm bin)/jasmine
(prawdopodobnie wymyśliłeś to, ale wyjaśniłeś innym).Posługiwać się
npm run[-script] <script name>
Po użyciu npm do zainstalowania pakietu bin w
./node_modules
katalogu lokalnym , zmodyfikuj,package.json
aby dodać w<script name>
następujący sposób: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.
źródło
npm install
wtedy masz dostęp do swoich zależności programistycznych. Jedynym drobnym minusem jest to, że musisznpm run eslint
(lub cokolwiek). Możesz utworzyć skrypt o nazwie „start”, który uruchamia gulp, więc wystarczy wpisać,npm start
aby uruchomić serwer deweloperski. Całkiem fajne rzeczy i bez bashu, więc Twoi znajomi z systemu Windows nadal cię lubią. :)--
:npm run learnyounode -- --normal-switches --watch -d *.js
npm run ts-node
nie działa dla mnie. Będę musiał po prostu ressortować do npx.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
Instalacja
źródło
Aktualizacja: Nie polecam już tej metody, zarówno ze względu na wspomniane względy bezpieczeństwa, jak i nowsze
npm bin
polecenie. 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/.bin
pierwszym miejscu swoją ścieżkę:Jeśli umieścisz to w swoim
~/.profile
,coffee
zawsze będzie./node_modules/.bin/coffee
dostępne, w przeciwnym razie/usr/local/bin/coffee
(lub jakikolwiek prefiks, pod którym instalujesz moduły węzłów).źródło
./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
/tmp
), każdy proces lub użytkownik może przechwycić sesję przez wprowadzenie złośliwych wersje zwykłych poleceń (jakls
,cp
etc.) tam. Mogą one odradzać „niewidzialne” podpowłoki przechwytujące hasła itp.alias npm-exec='PATH=$(npm bin):$PATH'
jest płaszcz.PATH
, ale ostatniej (używając$(npm bin)
formularza)? więc nie mogą nadpisać twoich istniejących rzeczy, a ty ufasz plikom wykonywalnym wnpm bin
katalogu już bez względu naPATH
var; 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 znpm
programów zainstalowanych.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:
Można to następnie wykorzystać w następujący sposób bez wprowadzania zmian w środowisku:
źródło
n
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ć:
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ł:
Więc nie musisz konfigurować skryptów dla każdego polecenia w swoim
package.json
.Jeśli masz skrypt zdefiniowany w
.scripts
swoimpackage.json
:yarn tsc
byłoby równoważneyarn run tsc
lubnpm run tsc
:źródło
aktualizacja: jeśli korzystasz z najnowszej wersji npm (wersja> 5.2)
Możesz użyć:
npx
szuka polecenia w.bin
katalogu twojegonode_modules
stara odpowiedź:
Dla Windowsa
Zapisz następujące elementy w pliku o nazwie
npm-exec.bat
i dodaj go do swojego%PATH%
Stosowanie
Następnie możesz go użyć jak
npm-exec <command> <arg0> <arg1> ...
Na przykład
Aby wykonać
wdio
instalację zainstalowaną w lokalnym katalogu modułów_węzła, wykonaj:tj. będzie działać
.\node_modules\.bin\wdio wdio.conf.js
źródło
Wolę nie polegać na aliasach powłoki lub innym pakiecie.
Dodając prosty wiersz do
scripts
sekcjipackage.json
, możesz uruchamiać lokalne polecenia npmnpm run webpack
pakiet.json
źródło
Jeśli chcesz, aby zmienna PATH poprawnie aktualizowała się w oparciu o bieżący katalog roboczy, dodaj to na końcu swojego
.bashrc
ekwiwalentu (lub po cokolwiek, co definiujePATH
):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-mode
inode-mode-off
odpowiednio.źródło
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:
Mogę to zrobić z konsoli:
Oto artykuł, który napisałem o NPX i który zagłębia się w to.
źródło
zxc jest jak „bundle exec” dla nodejs. Jest podobny do używania
PATH=$(npm bin):$PATH
:źródło
Akceptowane to samo @regular, ale smak rybiej skorupy
źródło
Możesz także użyć direnv i zmienić zmienną $ PATH tylko w folderze roboczym.
źródło
Dodaj ten skrypt do swojego
.bashrc
. Następnie możesz zadzwonićcoffee
lub zadzwonić lokalnie. Jest to przydatne dla laptopa, ale nie używaj go na serwerze.Uwaga : ten skrypt tworzy alias
cd
polecenia, a po każdym jego wywołaniucd
sprawdzanode_modules/.bin
i dodaje go do twojego$PATH
.uwaga 2 : możesz zmienić trzecią linię na
NODE_MODULES=$(npm bin);
. Ale to spowodowałoby, żecd
dowodzenie byłoby zbyt wolne.źródło
$(npm bin)
zamiast na stałe./node_modules/.bin
.$(npm bin)
wydaje się zbyt wolny, by używać go z każdymcd
poleceniem. Przywróciłem kod i dodałem notatkę.W systemie Windows użyj tego:
źródło
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 :
a następnie możesz użyć dowolnego pliku wykonywalnego w lokalnym
/bin
za pomocą tego polecenia:Jeśli używasz
scripts
w package.json:źródło
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 bin
do znalezienia katalogu, i uruchamiając skrypt tylkonpm bin
wtedy, gdy apackage.json
jest obecny w rodzicu (dla szybkości), oto co wymyśliłemzsh
:Ponieważ
bash
zamiast używaćprecmd
haka, możesz użyć$PROMPT_COMMAND
zmiennej (nie testowałem tego, ale masz pomysł):źródło
npm bin
do końca$PATH
może nie wykonać tego, czego oczekuje użytkownik: w zasadzie inny plik wykonywalny, ale bardziej prawdopodobnie pakiet zainstalowany globalnie z inną wersją!Jestem
Windows
użytkownikiem i właśnie to działało dla mnie:Powodzenia.
źródło
Jeśli używasz
fish shell
i nie chcesz dodawać do$path
ze względów bezpieczeństwa. Możemy dodać poniższą funkcję do uruchamiania plików wykonywalnych węzła lokalnego.Teraz możesz uruchomić takie rzeczy jak:
n coffee
lub więcej argumentów takich jak:
n browser-sync --version
Uwaga: jeśli jesteś
bash
użytkownikiem, to odpowiedzi @ Bob9630 są dobrym sposobem na skorzystanie z bash$@
, który nie jest dostępny wfishshell
.źródło
Dołącz skrypt kawy w pakiecie.json z określoną wersją wymaganą w każdym projekcie, zwykle tak:
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.
źródło
npm install svgo
tak dobrze, jaknpm install
z package.json. Obie metody zostały zainstalowane „pomyślnie”, ale polecenie „svgo” jest nadal niedostępne.grunt-cli
pakiet globalnie, następnie w katalogu projektu zainstaluj dowolną (zmodyfikowaną) wersjęgrunt
pakietu, a następnie po uruchomieniugrunt
użyje tej wersji lokalnej.