префикс глобального пути 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

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.


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. Смотрите мою правку.
Стивен Лу
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.