npm prefiks ścieżki globalnej

142

Jestem bardziej ostrożny niż zwykle, ponieważ byłem zdezorientowany zachowaniem npmw przeszłości.

Jestem na komputerze Mac i zainstalowałem node.js za pośrednictwem brew install node.

Teraz, gdy chcę uruchomić jslint.jsw wierszu poleceń jako polecenie jslint, stwierdzam, że kanonicznym sposobem na osiągnięcie tego jest sudo npm install -g jslintpomyślne uruchomienie z tym wyjściem:

$ sudo npm install -g jslint
npm http GET https://registry.npmjs.org/jslint
npm http 200 https://registry.npmjs.org/jslint
npm http GET https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http 200 https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http GET https://registry.npmjs.org/nopt
npm http 200 https://registry.npmjs.org/nopt
npm http GET https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http 200 https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http GET https://registry.npmjs.org/abbrev
npm http 200 https://registry.npmjs.org/abbrev
npm http GET https://registry.npmjs.org/abbrev/-/abbrev-l.0.4.tgz
npm http 200 https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz
/usr/local/share/npm/bin/jslint -> /usr/local/share/npm/lib/node_modules/jslint/
bin/jslint.js
jslint@0.1.9 /usr/local/share/npm/lib/node_modules/jslint
└── nopt@1.0.10 (abbrev@1.0.4)

Następnie

$ jslint ply.js
zsh: command not found: jslint

z powodu /usr/local/share/npm/binbraku w moim $PATH.

1) Dlaczego brewnie zainstalowano globalnej npm binścieżki dostępu? Może tak, ale coś zshgo psuje. Gdzie mogę to znaleźć?
2) Czy mam to zrobić? (Dołącz :/usr/local/share/npm/bindo wyeksportowanego $PATHna dole mojego ~/.zshrc)

Wygląda na to, że nie jest to właściwy sposób, aby to zrobić, ponieważ jeśli później zainstaluję coś innego (używając Homebrew lub czegoś podobnego), będę musiał dołączyć to do mojego skryptu startowego zsh, aby ustawić ścieżkę. Wydaje mi się, że w tym konkretnym przypadku chodzi tylko o to, aby npm install -gnie tworzyć właściwych linków symbolicznych w „właściwej” lokalizacji (jak /usr/local/binmoże).

Myślę, że to, co zrobię, to ręcznie zbuduję dowiązania symboliczne /usr/local/bindo wszelkich programów, z którymi mam problem i powinno to wystarczyć do moich celów.

EDYCJA : Aktualizuję to w 2019 roku, ponieważ to stare pytanie jest popularne, ale teraz jest przestarzałe zarówno pod względem mojego osobistego przepływu pracy, jak i pod względem tego, jak najlepiej zająć się instalacją węzła i zarządzaniem różnymi jego zależnościami.

Mój osobisty przepływ pracy polega teraz na użyciu instalatora uzyskanego z nodejs.org do zainstalowania węzła w systemach. W rzeczywistości ufam temu bardziej niż samemu pakietowi homebrew, ponieważ najlepiej wie, jak zarządzać plikami. Jeśli chcesz zmienić węzeł systemowy z 8.10 na 10.15, czy to w systemie Mac, czy Windows, po prostu pobierz instalator z nodejs.org dla 10.15 dla swojego systemu operacyjnego. Z mojego doświadczenia wynika, że ​​próba uaktualnienia węzła zainstalowanego za pośrednictwem homebrew zawsze okazała się trudniejszym podejściem.

Ponadto, najważniejszą rzeczą, na którą należy zwrócić uwagę, jest to, że korzystanie z sudo, jak pokazano w mojej instalacji npm przykładu jslint powyżej, jest wysoce odradzane; Jestem prawie pewien, że pakiety homebrew nigdy nie powinny być instalowane ani w jakikolwiek sposób współpracujące przy użyciu superużytkownika. Nie powinno to być konieczne i doprowadzi do bólu głowy związanego z uprawnieniami do plików!

Ponadto polecam ESLint zamiast jslint i nie używałem jslint od lat.

Steven Lu
źródło
Dzięki, teraz są naprawione. Zwykle nie jestem taki nieostrożny, ale wpisałem to pytanie bardzo szybko
Steven Lu,
@DaveNewton Zwykle to robię, tak. To było naprawdę niechlujne pytanie, ale jest jednym z moich najpopularniejszych.
Steven Lu
czy nie jest łatwiej skopiować tekst niż zrzut ekranu? tak czy inaczej naprawiono.
1
@ saleemrashid1 ​​Hej, miałem zamiar to zrobić. Naprawdę to przeczytałeś i skopiowałeś? Dzięki.
Steven Lu
3
Tak! Nie ma za co. Pracuję nad grą i gdy czekałem, aż NPM ściągnie coś, zrobiłem to!

Odpowiedzi:

308

Przedłużenie PATHo:

export PATH=/usr/local/share/npm/bin:$PATH

to nie jest straszny pomysł. Powiedziawszy to, nie powinieneś tego robić.

Uruchom to:

npm config get prefix

Wartość domyślna na OS X to /usr/local, co oznacza, że ​​npm będzie umieszczać pliki binarne z dowiązaniami symbolicznymi do /usr/local/bin, które powinny już znajdować się na twoim PATH(szczególnie jeśli używasz Homebrew).

Więc:

  1. npm config set prefix /usr/local jeśli to coś innego, i
  2. Nie używaj sudoz npm! Zgodnie z dokumentacją jslint , powinieneś być w stanie to npm installzrobić.

Jeśli zainstalowałeś npm jako sudo ( sudo brew install), spróbuj ponownie zainstalować go za pomocą zwykłego ol ' brew install. Homebrew ma pomóc Ci zachować sudowolność.

Trevor Burnham
źródło
1
Dzięki! npmodmawia jednak instalacji na jslintcałym świecie. npm install -g jslintzawodzi. Error: EACCES, open '/Users/user/.npm/564fcf84-jslint.lock'
Steven Lu
2
Czy nie musiałbym, chown /usr/localjeśli chcę, aby jakiekolwiek skrypty zapisywały w nim linki bez wymagania sudo? Co powiesz na wykonanie tego, aby ustawić nom / node w ~/.localczy coś?
Steven Lu
2
SŁODKIE! Poszedłem i rozwiązałem różne dirs zdeponowane przez użytkownika rootw moim katalogu ~/(przez sudo rm -ron tmp/i a .npm/), a następnie npm install -g jslintdziałało pięknie. To fajne, że sam npm jest programem węzłowym i jest dla mnie trochę dowodem koncepcji wiersza poleceń JS, co zaczynam doceniać teraz, gdy rozumiem to nieco lepiej.
Steven Lu
2
@StevenLu Tak, chown-ing /usr/locali wszystko to jest standardową praktyką na OS X. Zobacz stronę rozwiązywania problemów na wiki Homebrew.
Trevor Burnham,
Tak, wygląda na to, że chowning /usr/localjuż nastąpiło na moim komputerze, w przeciwnym razie npmet al nie sudobyłby w stanie zdeponować linków w /usr/local/bin/itp.
Steven Lu
8

Spędziłem trochę czasu nad tym problemem, a przełącznik PATH nie pomagał. Moim problemem był błąd Homebrew / node / npm znaleziony tutaj - https://github.com/npm/npm/issues/3794

Jeśli masz już zainstalowany węzeł przy użyciu Homebrew, spróbuj **** Uwaga na komentarze, że może to nie być bezpieczne. U mnie to zadziałało, ale mogło mieć niezamierzone konsekwencje. Wydaje się również, że najnowsza wersja Homebrew poprawnie instaluje npm. Więc prawdopodobne, że chciałbym spróbować brew update, brew doctor, brew upgrade nodeetc przed próbą ****:

npm update -gf

Lub, jeśli chcesz zainstalować węzeł z Homebrew i mieć pracę npm, użyj:

brew install node --without-npm
curl -L https://npmjs.org/install.sh | sh
YPCrumble
źródło
3
Przypadkowe zalecanie ludziom na całym świecie wymuszania aktualizacji nie jest dobrym pomysłem.
toxaq,
1
Ślepe stosowanie się do rad kogoś z internetu nie jest dobrym pomysłem.
Volte
Metoda siły na -gf zrobiła to za mnie. Dziękuję Ci.
MEM
5

Używam naparu, a prefiks był już ustawiony na:

$ npm config get prefix
/Users/[user]/.node

Zauważyłem, że foldery bin i lib były własnością roota, co uniemożliwiło zwykłą instalację bez sudo, więc ponownie posiadałem je użytkownikowi

$ cd /Users/[user]/.node
$ chown -R [user]:[group] lib
$ chown -R [user]:[group] bin

Następnie właśnie dodałem ścieżkę do mojego .bash_profile, który znajduje się w / Users / [user]

PATH=$PATH:~/.node/bin
Greg
źródło
3

brew nie powinien wymagać używania sudo, nawet jeśli uruchomisz npm z -g. W rzeczywistości może to spowodować więcej problemów w przyszłości.

Zwykle brew lub port pozwalają ci zaktualizować ścieżkę, więc nie ryzykujesz zepsucia twojego .zshrc, .bashrc, .cshrc lub innego rodzaju używanej powłoki.

Pascal Belloncle
źródło
Rzeczywiście napar nie wymaga i odradza stosowanie sudo. Używałem sudo na npm(ponieważ coś, co przeczytałem, kazało mi). Ciekaw jestem, gdzie sprawdzić, jak wytyczona jest ścieżka. Wygląda na to, że zshinstalator uruchamia coś, co kończy się na twardym zakodowaniu ścieżki (w momencie instalacji zsh) do .zshrcktórej nie lubię tak bardzo
Steven Lu
Wszystko, co zostało zainstalowane przez, npm powinno zostać zainstalowane w /usr/local. Przestrzeń /usrnazw ścieżki jest zarezerwowana dla oficjalnych pakietów twojej dystrybucji. /usr/local/binw twojej $ PATH czy nie, jest problem zsh.
Floby,
skrypty warzenia nie dodają nic do twojego skryptu startowego, to jest coś, co musisz zrobić. jako przykład zobacz madebyhoundstooth.com/blog/install-node-with-homebrew-on-os-x .
Pascal Belloncle
2

Udało mi się naprawić błąd polecenia Vue Cli, wykonując następujące czynności:

  • W terminalu, sudo nano ~/.bash_profileaby edytować swój profil bash.
  • Dodaj export PATH=$PATH:/Users/[your username]/.npm-packages/bin
  • Zapisz plik i zrestartuj terminal
  • Teraz powinieneś móc używać vue create my-projecti vue --versionitp.

Zrobiłem to po zainstalowaniu najnowszego Vue Cli z https://cli.vuejs.org/

Generalnie używam przędzy, ale zainstalowałem ją globalnie za pomocą npm npm install -g @vue/cli. Możesz też użyć przędzy, jeśli chceszyarn global add @vue/cli

Uwaga: może być konieczne najpierw odinstalowanie go globalnie, jeśli masz już zainstalowany: npm uninstall -g vue-cli

Mam nadzieję że to pomoże!

Mark Fasel
źródło
1
To w zasadzie zadziałało dla mnie. Musiałem to dostosować, aby wyeksportować PATH = $ PATH: / Users / [twoja nazwa użytkownika] /node_modules/.bin
Mike Carpenter
0

Spróbuj biegać:

PATH=$PATH:~/npm/bin

a następnie wykonaj test, uruchamiając expressw wierszu poleceń. To zadziałało dla mnie.

kiko carisse
źródło
całkiem pewien, że masz na myśli, ~/.npm/binczy coś takiego. nie powinno być npmdodanego katalogu do twojego domowego reż.
Steven Lu
0

Jeśli połączyłeś pakiety węzłów za pomocą polecenia sudo

Następnie przejdź do folderu, w którym moduły node_modules są zainstalowane globalnie.

W systemach uniksowych są one zwykle umieszczane w / usr / local / lib / node lub / usr / local / lib / node_modules, gdy są instalowane globalnie. Jeśli ustawisz zmienną środowiskową NODE_PATH na tę ścieżkę, moduły można znaleźć według węzła.

Windows XP -% USERPROFILE% \ Application Data \ npm \ node_modules Windows 7 -% AppData% \ npm \ node_modules

a następnie uruchom polecenie

ls -l

Spowoduje to wyświetlenie listy wszystkich globalnych modułów node_modules i będzie można łatwo zobaczyć połączone moduły węzłów.

selftaught91
źródło
0

sudo brew nie jest już opcją, więc jeśli zainstalujesz z brew w tym momencie, otrzymasz 2 naprawdę nieprzyjemne rzeczy: O: lubi instalować w /usr/local/opts/ usr / local / shared. Na początku nie jest to wielka sprawa, ale miałem problemy z węzłem PATH, zwłaszcza gdy zainstalowałem lint. B: utkniesz z poleceniami sudo, dopóki nie odinstalujesz i nie zainstalujesz go w ten sposób lub nie możesz pobrać stosu z Bitnami

Polecam tę metodę zamiast opcji stosu, ponieważ jest gotowa do użycia, jeśli masz wiele projektów. Jeśli pójdziesz z gotowym stosem MEAN, będziesz musiał skonfigurować wirtualne hosty w httpd.conf (bardziej uciążliwe w tym stosie niż XAMPP), a następnie zaktualizuj swoje dodatkowe / vhosts.conf i / etc / hosts dla każdego dodatkowego projekt, chyba że chcesz ponownie wskazać i zrestartować serwer po zakończeniu aktualizacji.

anioł
źródło
0

Proste rozwiązanie to ...

Po prostu wpisz poniższe polecenie:

  1. sudo npm config get prefix

    jeśli to nie jest coś takiego /usr/local, musisz to naprawić za pomocą poniższego polecenia.

  2. sudo npm config set prefix /usr/local...

Teraz w 100% działa dobrze

Yogesh Kumar
źródło
Gorąco polecam unikanie sudo z npm. Zobacz moją edycję.
Steven Lu