префікс глобального шляху npm


142

Я більш обережний, ніж зазвичай, тому що мене збентежила поведінка npmв минулому.

Я на Mac і встановив node.js через brew install node.

Тепер, коли я хочу запустити jslint.jsкомандний рядок як команду, jslintя знаходжу, що канонічний спосіб досягти цього - це те, sudo npm install -g jslintщо успішно працює з цим результатом:

$ 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)

Згодом

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

через те, що /usr/local/share/npm/binне в моїй $PATH.

1) Чому brewне встановили глобальний npm binшлях до шляху? Можливо, так і було, але щось zshце псує. Де я міг би це знайти?
2) Чи варто це робити? (Додайте :/usr/local/share/npm/binдо експортованого $PATHвнизу мого ~/.zshrc)

Здається, це не правильний спосіб зробити це, тому що якщо я інсталюю щось інше пізніше (використовуючи Homebrew або щось подібне), мені знадобиться додати його до мого сценарію запуску zsh, щоб встановити шлях. Я думаю, що в цьому конкретному випадку це лише питання про те, щоб npm install -gне зробити правильних символьних посилань у "правильному" місці (як, /usr/local/binможливо).

Я думаю, що я буду вручну створювати посилання всередині /usr/local/binдля будь-яких програм, з якими я маю проблеми, і це повинно бути досить добре для моїх цілей.

EDIT : Я оновлюю це в 2019 році, оскільки це старе питання популярне, але тепер застаріло як з точки зору мого особистого робочого процесу, так і з точки зору того, як найкраще піти про встановлення вузла та управління його різними залежностями.

Мій особистий робочий процес тепер використовувати інсталятор, отриманий від nodejs.org, для встановлення вузла в системах. Я фактично довіряю цьому більше, ніж самому пакунку домашньої програми, тому що він найкраще знає, як керувати файлами. Якщо ви хочете змінити свій системний вузол з 8.10 на 10.15, будь то на Mac чи Windows, просто завантажте інсталятор з nodejs.org на 10.15 для вашої ОС. Спроба оновити вузол, встановлений через homebrew, на моєму досвіді завжди виявилася більш складним підходом.

Крім того, найголовніше, що слід зазначити, це те, що використання судо, як показано в моїй npm-установці прикладу jslint вище, дуже обережно; Я цілком впевнений, що пакунки з домашньою мовою ніколи не повинні встановлюватись і не взаємодіяти з ними за допомогою суперпользователя. Це не повинно бути необхідним, і це призведе до подачі дозволу на головні болі!

Крім того, я рекомендую ESLint за jslint, і не використовував jslint протягом багатьох років.


Дякую, зараз вони виправлені. Я, як правило, не такий небайдужий, але я дуже швидко набрав це питання
Стівен Лу,

@DaveNewton Я зазвичай це роблю, так. Це питання було справжнім неохайним, але це одне з моїх найпопулярніших.
Стівен Лу

чи не простіше скопіювати текст, ніж скріншот? все одно виправлено.

1
@ saleemrashid1 ​​Ей, я мав намір це зробити. Ви справді це прочитали та скопіювали? Дякую.
Стівен Лу

3
Так! Ласкаво просимо. Я працюю над грою, і поки я чекав на NPM, щоб завантажити речі, я це зробив!

Відповіді:


308

Розширення PATH:

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

не страшна ідея. Сказавши це, вам не слід було цього робити.

Виконати це:

npm config get prefix

Типовим для OS X є /usr/local, що означає, що npm буде символізувати бінарні файли /usr/local/bin, які вже мають бути у вашому PATH(особливо якщо ви використовуєте Homebrew).

Так:

  1. npm config set prefix /usr/local якщо це щось інше, і
  2. Не використовуйте sudoз npm! Згідно з документами jslint , ви повинні просто вміти npm install.

Якщо ви встановили npm як sudo ( sudo brew install), спробуйте встановити його за допомогою простого ol ' brew install. Домашня мова повинна допомогти вам зберегтись sudo.


1
Дякую! Однак npmвідмовляється встановлювати jslintглобально. npm install -g jslintне вдається. Error: EACCES, open '/Users/user/.npm/564fcf84-jslint.lock'
Стівен Лу

2
Чи не потрібно мені, chown /usr/localякщо я маю якісь сценарії писати посилання на нього, не вимагаючи sudo? Як щодо виконання цього пункту, щоб встановити nom / вузол ~/.localчи щось таке?
Стівен Лу

2
СЛАДКА! Я пішов і розв'язав різні каталоги , депоновані користувачем rootв моїй ~/директорії (по sudo rm -rна tmp/і .npm/) , а згодом npm install -g jslintпрацював прекрасно. Це чудово, що npm сам по собі є вузловою програмою і є трохи для мене коректним поняттям командного рядка JS, яке я починаю цінувати тепер, коли я це розумію трохи краще.
Стівен Лу

2
@StevenLu Так, chown-ing /usr/localі все, що в ньому є, є стандартною практикою в OS X. Дивіться сторінку усунення несправностей на вікі Homebrew.
Тревор Бернхем

Так, схоже, chownІнг з /usr/localуже сталося на моїй машині інакше і npmін бігти без sudoне зможе внести посилання на /usr/local/bin/пр
Стівен Лу

8

Витратили деякий час на цю проблему, і переключення PATH не допомогло. Моєю проблемою була помилка Homebrew / node / npm, знайдена тут - https://github.com/npm/npm/isissue/3794

Якщо ви вже встановили вузол за допомогою Homebrew, спробуйте **** Примітка за коментарями, що це може бути не безпечно. Це працювало для мене, але могло мати непередбачувані наслідки. Також виявляється, що остання версія Homebrew правильно встановлює npm. Так що, швидше за все , я хотів би спробувати brew update, brew doctor, і brew upgrade nodeт.д. , перш ніж намагатися ****:

npm update -gf

Або якщо ви хочете встановити вузол з Homebrew і мати npm роботу, скористайтеся:

brew install node --without-npm
curl -L https://npmjs.org/install.sh | sh

3
Випадково рекомендувати, що люди в усьому світі вимагають оновлення - це не дуже гарна ідея.
toxaq

1
Сліпо виконувати поради когось із інтернетів - це не дуже гарна ідея.
Volte

Метод сили на -gf зробив це для мене. Дякую.
MEM

5

Я використовую brew, а префікс вже встановлено так:

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

Я помітив, що папка bin and lib була власністю root, що перешкоджало встановленню звичайних не sudo, тому я повторно володів ними користувачеві

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

Тоді я просто додав шлях до мого .bash_profile, який знаходиться за адресою / Users / [user]

PATH=$PATH:~/.node/bin

3

brew не повинен вимагати використання судо, навіть коли ви працюєте npm з -g. Це насправді може створити більше проблем у дорозі.

Зазвичай варіння або порт дозволяють вам оновити шлях, щоб це не загрожувало зіпсувати ваші .zshrc, .bashrc, .cshrc або будь-який смак оболонки, який ви використовуєте.


Дійсно, заварка не вимагає і не рекомендує проти вживання sudo. Я використовував судо npm(бо щось, що я читав, мені говорив). Мені цікаво, де шукати, як встановлений шлях. Насправді здається, що zshінсталятор виконує щось, що закінчується жорстким кодуванням шляху (на момент встановлення zsh), до .zshrcякого я не дуже люблю
Стівен Лу,

Все, що встановлено, npm повинно бути встановлено в /usr/local. /usrПростір імена шляху зарезервовано для офіційних пакунків дистрибутиву. /usr/local/binу вашому $ PATH чи ні, це проблема zsh.
Флобі

сценарії заварювання нічого не додають до вашого сценарію запуску, це те, що вам потрібно зробити. для прикладу див. madebyhoundstooth.com/blog/install-node-with-homebrew-on-os-x .
Паскаль Беллонкл

2

Мені вдалося виправити Vue Cli без помилки команди, зробивши наступне:

  • У терміналі sudo nano ~/.bash_profileдля редагування вашого баш-профілю.
  • Додайте export PATH=$PATH:/Users/[your username]/.npm-packages/bin
  • Збережіть файл та перезавантажте термінал
  • Тепер ви повинні мати можливість використовувати vue create my-projectі vue --versionт.д.

Я зробив це після встановлення останнього клієнта Vue від https://cli.vuejs.org/

Я зазвичай використовую пряжу, але я встановив це глобально з npm npm install -g @vue/cli. Ви також можете використовувати пряжу, якщо хочетеyarn global add @vue/cli

Примітка. Можливо, вам доведеться спочатку видалити її глобально, якщо вона вже встановлена: npm uninstall -g vue-cli

Сподіваюся, це допомагає!


1
Це в основному працювало для мене. Мені довелося налаштувати його, щоб експортувати PATH = $ PATH: / Users / [ваше ім’я] /node_modules/.bin
Майк Карпентер,


0

Спробуйте запустити:

PATH=$PATH:~/npm/bin

а потім зробіть тест, запустивши expressв командному рядку. Це працювало для мене.


досить впевнений, ти маєш на увазі ~/.npm/binчи щось таке. npmу вашому домашньому режисері не повинно бути доданого режисура.
Стівен Лу

0

Якщо ви зв'язали пакети вузлів за допомогою команди sudo

Потім перейдіть до папки, в якій node_modules встановлені глобально.

У системах Unix вони, як правило, розміщуються в / usr / local / lib / node або / usr / local / lib / node_modules, коли встановлюються глобально. Якщо встановити змінну середовища NODE_PATH на цей шлях, модулі можна знайти по вузлу.

Windows XP -% USERPROFILE% \ Дані програми \ npm \ node_modules Windows 7 -% AppData% \ npm \ node_modules

а потім запустіть команду

ls -l

Це дасть список усіх глобальних модулів node_, і ви зможете легко побачити пов'язані модулі вузлів.


0

sudo brew більше не є варіантом, тому якщо ви встановите з brew у цей момент, ви отримаєте 2 дійсно неприємні речі: A: він любить встановлювати в /usr/local/optsабо відповідно до цього, / usr / local / shared. Спочатку це не велика справа, але у мене виникли проблеми з вузлом PATH, особливо коли я встановив обличчя. B: Ви начебто застрягли з командами sudo, поки не видалите і не встановите його таким чином, або не зможете отримати стек від Bitnami

Я рекомендую цей метод у варіанті стека, оскільки він готовий перейти, якщо у вас є кілька проектів. Якщо ви перейдете з попередньо складеним стеком MEAN, вам доведеться налаштувати віртуальних хостів у httpd.conf (більший біль у цьому стеці, ніж XAMPP), а також оновити додаткові / vhosts.conf та / etc / hosts для кожного додаткового Проект, якщо ви не хочете переназначити та перезапустити сервер, коли завершите оновлення речей.


0

Просте рішення - це ...

Просто поставте команду нижче:

  1. sudo npm config get prefix

    якщо це не щось подібне /usr/local, то вам потрібно це виправити за допомогою команди нижче.

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

Зараз це на 100% працює добре


Дуже рекомендую уникати судо з npm. Дивіться мою редакцію.
Стівен Лу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.