Globalna instalacja NPM „nie można znaleźć modułu”

206

Napisałem moduł, który przed chwilą opublikowałem npm (https://npmjs.org/package/wisp)

Więc instaluje się dobrze z linii poleceń:

$ npm i -g wisp

Jednak po uruchomieniu go z wiersza poleceń pojawia się błąd, że optymista nie jest zainstalowany:

$ wisp 
Error: Cannot find module 'optimist'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:12:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:96:4)
    at Module._compile (module.js:449:26)
    at Object.exports.run (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:68:25)
    at compileScript (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:135:29)
    at fs.stat.notSources.(anonymous function) (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:110:18)

Podałem jednak w pakiecie.json jako zależność:

{
  "name": "wisp",
  "author": "Brendan Scarvell <[email protected]>",
  "version": "0.1.0",
  "description": "Global nodejs file server",
  "dependencies": {
    "optimist": "~0.3.4"
  },
  "repository": "git://github.com/tehlulz/wisp",
  "bin": {
    "wisp" : "./wisp"
  }
}

Czy ktoś wie, co zrobić, aby uruchomić to? Wiem, że ma to związek z tym, że część bin dodaje plik wykonywalny do bin, a moduły node_module w tym katalogu są puste. Nie mam pojęcia, jak to rozwiązać.

Menztrual
źródło
co się stanie, jeśli zainstalujesz bez opcji -g?
vinayr
Instaluje folder node_modules w bieżącym katalogu, który zawiera wisp.
Menztrual,
Wiem. Czy nadal pojawia się błąd?
vinayr
Tak. Jeśli spróbuję uruchomić WISP po wykonaniu lokalnego NMP i Wisp, nadal zwraca ten sam błąd
Menztrual
Właśnie zainstalowałem twój moduł. Dla mnie działa dobrze. Gdzie jest twój kosmek? W moim przypadku działałem, ./node_modules/wisp/wispco działa dobrze.
vinayr

Odpowiedzi:

370

Dla każdego, kto na to wpadł, miałem ten problem z powodu npminstalacji w miejscu, którego nie ma na mojej stronie NODE_PATH.

[root@uberneek ~]# which npm
/opt/bin/npm
[root@uberneek ~]# which node
/opt/bin/node
[root@uberneek ~]# echo $NODE_PATH

Moja NODE_PATH była pusta, a uruchomienie npm install --global --verbose promised-iopokazało, że instaluje się w /opt/lib/node_modules/promised-io:

[root@uberneek ~]# npm install --global --verbose promised-io
npm info it worked if it ends with ok
npm verb cli [ '/opt/bin/node',
npm verb cli   '/opt/bin/npm',
npm verb cli   'install',
npm verb cli   '--global',
npm verb cli   '--verbose',
npm verb cli   'promised-io' ]
npm info using npm@1.1.45
npm info using node@v0.8.4
[cut]
npm info build /opt/lib/node_modules/promised-io
npm verb from cache /opt/lib/node_modules/promised-io/package.json
npm verb linkStuff [ true, '/opt/lib/node_modules', true, '/opt/lib/node_modules' ]
[cut]

Mój skrypt nie działa require('promised-io/promise'):

[neek@uberneek project]$ node buildscripts/stringsmerge.js 

module.js:340
    throw err;
          ^
Error: Cannot find module 'promised-io/promise'
    at Function.Module._resolveFilename (module.js:338:15)

Prawdopodobnie zainstalowałem węzeł i npm ze źródła za pomocą configure --prefix=/opt. Nie mam pojęcia, dlaczego to uniemożliwiło im znalezienie zainstalowanych modułów. Na razie poprawka polega na wskazaniu NODE_PATH we właściwym katalogu:

export NODE_PATH=/opt/lib/node_modules

Mój require('promised-io/promise')teraz się udaje.

Neek
źródło
10
gdzie ustawić tę NODE_PATH?
piaszczysty
8
@sandy, w którym ustawiasz zmienną środowiskową NODE_PATH, zależy od systemu operacyjnego. Używam smaku Linuksa, więc export NODE_PATH=...ustawiłem go w lokalnej powłoce, tak aby był eksportowany do poleceń uruchamianych w tej powłoce. Aby zmiana była trwała lub dostępna dla wszystkich powłok, umieść ją w .profile lub podobnym. Koncepcja jako całość jest irytująco złożona dla początkujących, spróbuj przeczytać help.ubuntu.com/community/EnvironmentVariables . W systemie Windows chcesz przełączyć się na system Linux. OK, tylko żartuję. Spróbuj computerhope.com/issues/ch000549.htm lub google go.
Neek
13
W przypadku OSX Lion działało to dla mnie ... eksport NODE_PATH = / usr / local / lib / node_modules Użyłem opcji „zlokalizuj moduły_węzła”, aby wyśledzić właściwą ścieżkę.
k1eran
2
NODE_PATH działa również dla WINDOWS. jest to zakorzenione w modułach węzłów, które można instalować zarówno lokalnie, jak i globalnie.
zinking
5
Jeśli zainstalowałeś Node.js z Homebrew na Mac OS X: Uruchom open -a TextEdit ~/.bash_profilew Terminalu, a następnie dodaj export NODE_PATH=/usr/local/lib/node_modulesna końcu pliku. Uruchom ponownie okno terminalu. Teraz uruchomiony echo $NODE_PATHpowinien wydrukować /usr/local/lib/node_modules.
Pwdr,
39

dodaj to na początku prog (mac):

module.paths.push('/usr/local/lib/node_modules');

Cando Zhou
źródło
4
Jakiś sposób to zrobić w sposób nieokreślony dla systemu operacyjnego?
UpTheCreek
@UpTheCreek jest to sposób nieokreślony dla systemu operacyjnego . Jest to kod JS, wystarczy wskazać moduł_węzła, który ma moduły, których szukasz
Adelin
@Adelin - Jest to rozwiązanie specyficzne dla systemu operacyjnego, ponieważ lokalizacja globalnych modułów node_modu jest specyficzna dla systemu operacyjnego. Na przykład, jeśli programujesz w systemie Windows i używasz Linuksa w produkcji, nie jest to świetne rozwiązanie.
UpTheCreek
Łatwo to pokonać. Na przykład możesz zapisać ścieżkę węzła na przykład w zmiennej env i zastąpić ścieżkę zakodowaną na stałe os.environ.nodepath(coś wzdłuż tych linii).
Adelin
MacOS Mojave 10.14.6 wymaga dodania eksportu NODE_PATH = / usr / local / lib / node_modules / npm / node_modules do ~ / bash_profile, który jest bardziej niezależny od komputera, ponieważ nie ma wpływu na natywny kod .js.
vwvan
16

Domyślnie węzeł nie zagląda do / usr / local / lib / node_module pod kątem ładowania modułów globalnych. Zobacz ładowanie modułu wyjaśnione w http://nodejs.org/api/modules.html#modules_loading_from_the_global_folders

Musisz więc 1) dodać / usr / local / lib / node_module do NODE_PATH i wyeksportować go lub 2) skopiować zainstalowane moduły węzła do / usr / local / lib / node. (Jak wyjaśniono w linku do ładowania modułu węzeł przeszuka tę ścieżkę i będzie działać)

losowość
źródło
10

W przypadku niektórych (jak ja), że nic innego nie działa, spróbuj tego:

brew cleanup
brew link node
brew uninstall node
brew install node

Mam nadzieję, że to komuś pomoże :)

Będzie
źródło
9

Poniższa poprawka ogólna byłaby dla każdego modułu. Na przykład z request-promise.

Zastąpić

npm install request-promise --global

Z

npm install request-promise --cli

pracował ( źródło ), a także dla globalsiinherits

Spróbuj także ustawić zmienną środowiskową

NODE_PATH=%AppData%\npm\node_modules
Mohammed Zameer
źródło
3

$ vim /etc/profile.d/nodejs.sh

NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
export NODE_PATH="$NODE_PATH"
użytkownik1959076
źródło
To jest domyślnie. Dla użytkowników jest on załadowany, ale nie działa jako root, dlatego musi zostać uwzględniony w ścieżce użytkownika root.
stamster
2

W przypadku systemu Windows Nodejs nie może znaleźć zainstalowanego modułu w systemie Windows? to, co zadziałało, to działające łącze npm jak w

npm link wisp
PO POŁUDNIU
źródło
Słowo ostrzeżenia - zrobiłem to, ale nie mogłem użyć kodu zip z AWS lambda. Musiałem mieć lokalnie utworzony moduł_węzła jak w npm install wisp --save(bez opcji -g)
PM
2

Dla użytkowników komputerów Mac Najlepiej skorzystać z instalacji ręcznej:

Aby zminimalizować ryzyko błędów uprawnień, możesz skonfigurować npm do korzystania z innego katalogu. W tym przykładzie będzie to ukryty katalog w folderze domowym.

  1. Utwórz kopię zapasową komputera przed rozpoczęciem.

  2. Utwórz katalog dla instalacji globalnych:

    mkdir ~ / .npm-global

  3. Skonfiguruj npm, aby używał nowej ścieżki do katalogu:

    przedrostek zestawu konfiguracji npm „~ / .npm-global”

  4. Otwórz lub utwórz plik ~ / .profile i dodaj ten wiersz:

    export PATH = ~ / .npm-global / bin: $ PATH

  5. Wróć do wiersza poleceń i zaktualizuj zmienne systemowe:

    source ~ / .profile

  6. Test: pobierz pakiet globalnie bez użycia sudo.

    npm install -g jshint

Zamiast kroków 2-4 możesz użyć odpowiedniej zmiennej ENV (np. Jeśli nie chcesz modyfikować ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global

Odniesienie: https://docs.npmjs.com/getting-started/fixing-npm-permissions

Shivansh Rajpoot
źródło
1

Miałem ten sam problem na jednym z serwerów testowych działających Ubuntupod root. Następnie stworzył nowego użytkownika używając useradd -m myuseri zainstalowane wszystko ( nvm, nodepakiety), jak myuser. Teraz działa dobrze.

Dmitriy
źródło
1

W systemie Windows, jeśli właśnie wykonałeś czystą instalację, a otrzymasz to, musisz zdmuchnąć swoją pamięć podręczną npm w \ AppData \ Roaming

Dmitry
źródło
1

W moim przypadku zarówno nodei npmbyły w tej samej ścieżce ( /usr/bin). NODE_PATHBył pusty, więc npmumieszczony globalnych modułów w /usr/lib/node_modulesktórym require(...)z powodzeniem je znaleźć. Jedynym wyjątkiem był npmmoduł dostarczany z pakietem nodejs. Ponieważ używam systemu 64-bitowego, został on umieszczony w /usr/lib64/node_modules. To nie jest miejsce, w którym wymagane są (...) wyszukiwania w przypadku pustych NODE_PATHi rozpoczynania węzła /usr/bin. Miałem więc dwie opcje:

  • połączyć /usr/lib64/node_modules/npm do/usr/lib/node_modules/npm
  • przenieś moduły z /usr/lib/node_modules/*do /usr/lib64/node_modules/i ustawNODE_PATH=/usr/lib64/node_modules

Oba działały. Używam OpenSUSE 42.1 i pakietu nodejs z repozytorium aktualizacji. Wersja to 4.4.5.

GT.
źródło
1

Zrobiłem to w prosty sposób ...

  1. Odinstaluj węzeł z panelu sterowania [Windows 7]
  2. Zainstaluj ponownie węzeł
  3. Zainstaluj kątomierz npm install --global --verbose protractor
    Zaktualizuj menedżera sterowników internetowych.

działa dobrze dla mnie.

Mam nadzieję, że to pomoże ci ....

Santhosh v
źródło
1

Wystąpił ten błąd, Error: Cannot find module 'number-is-nan'podczas gdy moduł faktycznie istnieje. Było to spowodowane nieprawidłową / niekompletną instalacją Node.js.

W przypadku systemu Windows, jak sugerują inne odpowiedzi, potrzebujesz czystej instalacji węzła :

  • Odinstaluj Node.js
  • Usuń dwa foldery npmi npm_cacheweC:\Users\user\AppData\Roaming
  • Uruchom ponownie system Windows i zainstaluj plik Node.js
  • Uruchom npm initlub ( npm init --yesdla domyślnej konfiguracji )
  • Ustaw zmienną środowiskową systemu Windows dla NODE_PATH. W tej ścieżce są zainstalowane Twoje pakiety. To chyba coś w styluNODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules
  • Uruchom nową konsolę cmd i npmpowinna działać poprawnie

Uwaga :

Wypróbuj ostatnie punkty przed ponowną instalacją Node.js, może to zaoszczędzić trochę czasu i uniknąć ponownej instalacji wszystkich pakietów.

alain.janinm
źródło
1

Właśnie spotkałem ten problem axiosmodułu. Potem spróbowałem: uruchom rm -rf node_modulesi yarn. I to działa.

Finedy
źródło
0

Miałem ten sam błąd co OP, ale przeglądałem dzienniki, które widziałem sh: node: command not found.

Okazuje się, że program / usr / bin / node (symlink) nie jest już instalowany z apt install nodejs. Raz /usr/bin/node' tosymlinkowane nodejs ,npm install -g @ angular / cli` powiodło się.

Właściwym sposobem zainstalowania tego na Debianie jest apt install nodejs-legacy.

mikrofon
źródło
0

Musiałem dodać C: \ Users \ {Nazwa użytkownika} \ AppData \ Roaming \ npm do moich zmiennych env, a następnie mogłem zainstalować różne rzeczy.

Rainhider
źródło