Próbuję zainstalować globalnie, a następnie używam forever
i forever-monitor
tak:
npm install -g forever forever-monitor
Widzę zwykłe dane wyjściowe, a także operacje, które kopiują pliki do ścieżki globalnej, ale jeśli spróbuję require("forever");
, pojawia się błąd informujący, że moduł nie został znaleziony.
Używam najnowszej wersji zarówno węzła, jak i npm i już wiem o zmianie, którą wprowadził npm w instalacji globalnej vs lokalnej, ale naprawdę nie chcę instalować lokalnie na każdym projekcie i pracuję na platformie, która to robi nie obsługuje, link
więc npm link
po instalacji globalnej nie jest dla mnie możliwe.
Moje pytanie brzmi: dlaczego nie mogę wymagać pakietu zainstalowanego globalnie? Czy to funkcja czy błąd? A może robię coś źle?
PS: Żeby było jasne: nie chcę instalować lokalnie.
~/.config/yarn/global
dla przędzyOdpowiedzi:
W Node.js, require nie zagląda do folderu, w którym są zainstalowane moduły globalne.
Możesz to naprawić, ustawiając zmienną środowiskową NODE_PATH. W Linuksie będzie to:
Uwaga: zależy to od tego, gdzie faktycznie są zainstalowane moduły globalne.
Zobacz: Ładowanie z folderów globalnych .
źródło
export NODE_PATH=/usr/local/lib/node_modules
Zamiast tego musiałem użyć .NODE_PATH
zmiennej środowiskowej naC:\Users\{USERNAME}\AppData\Roaming\npm\node_modules
prawdopodobnie zadziała.%AppData%\npm\node_modules
będzie działać w systemie Windows 10.NODE_PATH
czy mogę jednocześnie używać modułów globalnych i lokalnych?NODE_PATH=$(npm root -g)
Po zainstalowaniu pakietu globalnie musisz połączyć projekt lokalny z pakietem globalnym
Zobacz tutaj
źródło
~/some-stand-alone-random-nodejs-test.js
. Nie chcę zmieniać folderu domowego w katalog projektu. Nie chcę tworzyć nowych folderów dla każdego małego eksperymentu.npm link <module>
Następnie zobaczysz skrót (link) utworzony w folderze node_module twoich projektów, odnoszący się do modułu globalnego węzła.Przepraszamy za nekromancję, ale jestem w stanie określić zakodowane ścieżki do modułów zainstalowanych globalnie:
To nie jest idealne, ale biorąc pod uwagę, że Unity3d próbuje „skompilować” cały javascript, który jest zawarty w katalogu projektu, naprawdę nie mogę zainstalować żadnych pakietów.
źródło
Wiem, że to stare pytanie, ale natknąłem się na to, próbując sprawdzić niektóre wersje za
semver
pomocąpreinstall
skryptu w programiepackage.json
. Ponieważ wiedziałem, że nie mogę polegać na żadnych zainstalowanych modułach lokalnych, użyłem tego, aby wymagaćsemver
znode_modules
folderu globalnego (wnpm
zależności od tego wiem, że tam jest):Podoba mi się to podejście, ponieważ nie wymaga instalacji żadnych specjalnych modułów w celu użycia.
Nie poszedłem z
NODE_PATH
rozwiązaniem, które sugerowali inni, ponieważ chciałem, aby to działało na czyimś komputerze, bez konieczności dodatkowej konfiguracji / ustawień przed uruchomieniemnpm install
dla mojego projektu.Sposób, w jaki jest to zakodowane, gwarantuje znalezienie tylko modułów najwyższego poziomu (zainstalowanych przy użyciu
npm install -g ...
) lub modułów wymaganych przeznpm
(wymienionedependencies
tutaj: https://github.com/npm/npm/blob/master/package.json ). Jeśli używasz nowszej wersji NPM, może ona znaleźć zależności innych pakietów zainstalowanych globalnie, ponieważ teraz istnieje bardziej płaska strukturanode_modules
folderów.Mam nadzieję, że to komuś się przyda.
źródło
Zgodnie z dokumentacją Node.js będzie domyślnie wyszukiwać w następujących lokalizacjach:
Ścieżka określona w
NODE_PATH
zmiennej środowiskowej .Uwaga:
NODE_PATH
zmienna środowiskowa jest ustawiona na rozdzielaną dwukropkami listę ścieżek bezwzględnych.Bieżący
node_modules
folder. (lokalny)$HOME/.node_modules
(światowy)Uwaga:
$HOME
to katalog domowy użytkownika.$HOME/.node_libraries
(światowy)$PREFIX/lib/node
(światowy)Uwaga:
$PREFIX
jest skonfigurowany node.js użytkownikanode_prefix
.Aby sprawdzić aktualną wartość
node_prefix
, uruchom:Uwaga: przedrostek odpowiada
--prefix
parametrowi podczas kompilacji i jest względem niegoprocess.execPath
. Nie mylić z wartością znpm config get prefix
polecenia. źródłoJeśli danego modułu nie można znaleźć, oznacza to, że nie ma go w żadnej z powyższych lokalizacji.
Lokalizację globalnego folderu głównego, w którym instalowane są moduły, można wydrukować za pomocą:
npm root -g
(domyślnie ścieżka jest obliczana w czasie wykonywania, chyba że zostanie zastąpiona wnpmrc
pliku ).Rozwiązanie
Możesz wypróbować następujące obejścia:
Określ globalną lokalizację modułu w
NODE_PATH
zmiennej środowiskowej. Na przykładAby przetestować i wydrukować wartość
NODE_PATH
, uruchom:Aby uzyskać trwalsze rozwiązanie, połącz
$HOME/.node_modules
globalny folder użytkownika, aby wskazywał folder główny, uruchamiając to polecenie:Następnie ponownie przetestuj za pomocą:
echo 'require("forever")' | node
polecenie.Tymczasowo zmień bieżący folder na globalny, w którym rozszerzenie zostało zainstalowane, przed wywołaniem skryptu. Na przykład
Skonfiguruj globalne miejsce docelowe instalacji w
npm
pliku userconfig (zobacz :)npm help 5 npmrc
lub za pomocąuserconfig
param (--prefix
).Aby wyświetlić bieżący config, uruchom:
npm config list
.Aby edytować bieżący config, uruchom:
npm config edit
.Podczas wywoływania określ pełną ścieżkę lokalizacji modułów węzła
require()
. Na przykładZainstaluj pakiet w niestandardowej lokalizacji, np
Jednak instalacja ulegnie awarii
~/.node_modules/lib/node_modules/
, więc lokalizacja nadal wymaga dodania.Zobacz: lokalny pakiet instalacyjny npm do lokalizacji niestandardowej
Utwórz łącze symboliczne w bieżącym folderze z lokalizacji pakietu globalnego. Na przykład
źródło
Możesz użyć pakietu,
requireg
aby rozwiązać ten problem:da rade.
Jest też inny moduł,
global-npm
choć specyficzny tylko dla używania globalnegonpm
, możesz spojrzeć na krótki kod i zobaczyć, jak działa ta technika.źródło
NODE_PATH
polega również na tym, że nie musisz zmieniać żadnego kodu. (moim przypadkiem użycia jest ocenianie wielu projektów studenckich, w których nie chcę uruchamiaćnpm install
każdego z nich, a także nie chcę, aby dostarczalinode_modules
katalog).requireg
w pierwszej kolejności nie możesz wymagać , o to chodzi.W przypadku narzędzi CLI, które zależą od dużych modułów, na przykład
puppeteer
lubię spawnowaćnpm root -g
i używać go do wymagania modułu globalnego.źródło
Możesz umieścić tę linię w swoim
.profile
pliku:To sprawi
node
wykorzystanie ścieżki globalnej.źródło
node_modules
. To stara odpowiedź, ale pamiętam, że dostałem ją gdzieś w dokumentacji. W każdym razie na moim komputerze (w 2020 roku) jest globalnynode_modules
katalog npmusr/lib/node_modules
. W każdym razie ufam,npm config get prefix
ponieważ jest używany globalnie przez npm za każdym razem, gdy instalowany jest pakiet globalny, więc powinien mieć rację.package.json
pliku ani wyarn.lock
/package-lock.json
.node_modules
folderu, następnie katalogu nadrzędnego, potem nadrzędnego ... aż znajdzienode_modules
folder zawierający ten moduł. Jeśli jednak zainstalujesz pakiet globalnie, nie będzie on znajdował się w żadnymnode_modules
folderze powyżej bieżącego katalogu skryptu, więc używasz NODE_PATH jako rozwiązania zastępczego, w którym węzeł będzie szukał pakietów.