префикс глобального пути npm

145

Я веду себя более осторожно, чем обычно, потому что в прошлом меня смущало поведение 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для любых программ, с которыми у меня возникают проблемы, и этого должно быть достаточно для моих целей.

РЕДАКТИРОВАТЬ : Я обновляю это в 2019 году, потому что этот старый вопрос популярен, но теперь устарел как с точки зрения моего личного рабочего процесса, так и с точки зрения того, как лучше всего установить узел и управлять его различными зависимостями.

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

Кроме того, самое важное, что следует отметить, - это то, что использование sudo, как показано в приведенном выше примере установки jslint с помощью npm, крайне не рекомендуется; Я совершенно уверен, что пакеты homebrew никогда не должны устанавливаться или взаимодействовать с ними каким-либо образом с использованием суперпользователя. В этом нет необходимости, и это приведет к головной боли с разрешениями файлов!

Кроме того, я рекомендую ESLint вместо jslint и уже много лет не использую jslint.

Стивен Лу
источник
Спасибо, теперь они исправлены. Я обычно не настолько беспечен, но я очень быстро набрал этот вопрос
Стивен Лу
@DaveNewton Я обычно так делаю, да. Это был очень неряшливый вопрос, но он один из самых популярных.
Стивен Лу
не проще ли скопировать текст, чем скриншот? в любом случае исправлено.
1
@ saleemrashid1 ​​Эй, я хотел это сделать. Вы действительно прочитали и переписали? Спасибо.
Стивен Лу
3
Ага! Пожалуйста. Я работаю над игрой, и пока я ждал, пока NPM загрузит материал, я сделал это!

Ответы:

309

Расширение вашего 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), попробуйте переустановить его с помощью plain 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 / node ~/.localили что-то в этом роде?
Стивен Лу,
2
МИЛАЯ! Я пошел и отменил различные каталоги, размещенные пользователем rootв моем ~/каталоге (by sudo rm -ron tmp/и a .npm/), и впоследствии отлично npm install -g jslintработал. Приятно то, что npm сама по себе является программой узла и для меня является своего рода доказательством концепции командной строки JS, которую я начинаю ценить сейчас, когда понимаю ее немного лучше.
Стивен Лу,
2
@StevenLu Да, chown-ing /usr/localи все в нем - стандартная практика в OS X. См. Страницу устранения неполадок в вики Homebrew.
Trevor Burnham
Да, похоже, chownИнг из /usr/localуже произошло на моей машине иначе и npmдр бежать без sudoне сможет внести ссылки на /usr/local/bin/пр
Стивен Лу
8

Потратил некоторое время на эту проблему, и переключатель PATH не помог. Моя проблема заключалась в найденной здесь ошибке Homebrew / node / npm - https://github.com/npm/npm/issues/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
YPCrumble
источник
3
Небрежно рекомендовать людям глобально форсировать обновление - не лучшая идея.
toxaq
1
Слепое следование совету кого-то в Интернете - не лучшая идея.
Volte
Метод force на -gf сделал это за меня. Спасибо.
MEM
5

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

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

Я заметил, что папка bin и 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 не требует использования sudo даже при запуске npm с -g. На самом деле это может создать больше проблем в будущем.

Как правило, brew или port позволяют обновить ваш путь, чтобы не испортить ваши .zshrc, .bashrc, .cshrc или любой другой вариант оболочки, которую вы используете.

Паскаль Беллонкле
источник
Действительно варево не требует и не рекомендует использовать sudo. Я использовал sudo npm(потому что что-то, что я прочитал, подсказало мне это). Мне любопытно, где посмотреть, как проложен путь. На самом деле кажется, что zshустановщик запускает что-то, что в конечном итоге приводит к жесткому кодированию пути (во время установки zsh) в тот, .zshrcкоторый мне не очень нравится,
Стивен Лу
Все, что установлено, npm должно быть установлено в /usr/local. Пространство /usrимен path зарезервировано для официальных пакетов вашего дистрибутива. /usr/local/binв вашем $ PATH или нет, это проблема zsh.
Floby
сценарии brew ничего не добавляют к сценарию запуска, это то, что вам нужно сделать. см. пример на madebyhoundstooth.com/blog/install-node-with-homebrew-on-os-x .
Паскаль Беллонкле
2

Мне удалось исправить ошибку Vue Cli no command, выполнив следующие действия:

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

Я сделал это после того, как установил последнюю версию Vue Cli с 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% \ Application Data \ npm \ node_modules Windows 7 -% AppData% \ npm \ node_modules

а затем запустите команду

ls -l

Это даст список всех глобальных node_modules, и вы легко сможете увидеть связанные модули node.

самоучка91
источник
0

sudo brew больше не является вариантом, поэтому, если вы установите с помощью brew на этом этапе, вы получите 2 действительно неприятные вещи: A: ему нравится устанавливать в /usr/local/opts/ usr / local / shared или в соответствии с ним. Сначала это не имеет большого значения, но у меня были проблемы с узлом PATH, особенно когда я установил lint. 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% работает нормально

Йогеш Кумар
источник
Настоятельно рекомендую избегать использования sudo с помощью npm. Смотрите мою правку.
Стивен Лу