Подтвердить что ты не робот

Как сделать npm install global не как root?

Я нахожусь в unix-блоке, где у меня нет доступа root.

Я изменил свой файл .npmrc(в моем корневом каталоге пользователя) на:

prefix=~/global_npm

Теперь, когда я делаю "npm install -g packagename", он устанавливается внутри моего каталога global_npm. И это хорошо. И затем я дал себе доступ к нему, обновив файл .bashrc с помощью

export PATH=$PATH:~/global_npm/bin

Нужно ли мне что-нибудь делать? Я думаю, мне нужно установить NODE_PATH, но я не уверен?

4b9b3361

Ответ 1

У Sindre Sorhus есть отличный путеводитель в github.com/sindresorhus/guides, который я перепробовал здесь.


Установите пакеты npm глобально без sudo на OS X и Linux

npm устанавливает пакеты локально в ваших проектах по умолчанию. Вы также можете устанавливать пакеты по всему миру (например, npm install -g <package>) (полезно для приложений с командной строкой). Однако недостатком этого является то, что вы должны быть root (или использовать sudo), чтобы иметь возможность устанавливать глобально.

Вот способ установки пакетов по всему миру для данного пользователя.

1. Создайте каталог для глобальных пакетов

mkdir "${HOME}/.npm-packages"

2. Ссылка на этот каталог для будущего использования в .bashrc/.zshrc:

NPM_PACKAGES="${HOME}/.npm-packages"

3. Укажите npm, где хранить ваш глобально установленный пакет. В файле $HOME/.npmrc добавьте:

prefix=${HOME}/.npm-packages

4. Убедитесь, что node найдет их. Добавьте в свой .bashrc/.zshrc:

следующее:
NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"

5. Убедитесь, что вы найдете установленные двоичные файлы и справочные страницы. Добавьте в свой .bashrc/.zshrc:

следующее:
PATH="$NPM_PACKAGES/bin:$PATH"
# Unset manpath so we can inherit from /etc/manpath via the `manpath`
# command
unset MANPATH # delete if you already modified MANPATH elsewhere in your config
MANPATH="$NPM_PACKAGES/share/man:$(manpath)"

Зайдите npm-g_nosudo для выполнения вышеуказанных шагов автоматически


ПРИМЕЧАНИЕ. Если вы используете OS X, файл .bashrc может еще не существовать, и терминал будет получать свои параметры среды из другого файла, например .profile или .bash_profile. Эти файлы также находятся в домашней папке пользователя. В этом случае простое добавление к ним следующей строки будет инструктировать Terminal также загрузить файл .bashrc:

source ~/.bashrc

Ответ 2

Если вам не требуется установка пакета из-за редких зависимостей, я бы порекомендовал вам использовать NVM (https://github.com/creationix/nvm) для установки Node.

Если вы делаете это без sudo, вам также не понадобится использовать sudo при глобальной установке модулей.

Ответ 3

  • Либо запустите новый сеанс терминала, либо просто введите "source ~/.bashrc"
  • Теперь вы можете запускать любые исполняемые файлы, такие как grunt/bower/yo/whatever (в зависимости от того, какие пакеты npm вы установили глобально).

P.S. BTW, изменяющий глобальный каталог npm, можно выполнить с помощью команды: npm config set prefix ~/global_npm

Ответ 4

Мои изменения в ответе Rowno были отклонены, и я пока не могу комментировать, поэтому я просто опубликую свою версию строк, добавленных в .bashrc, здесь.

В него я добавил добавление export к назначениям NODE_PATH и MAN_PATH, а затем упростил назначение MANPATH. Я также сделал : необязательным для NODE_PATH на тот случай, если у него нет предыдущего значения. Другие изменения здесь - только личные предпочтения, но я не включил их в исходное редактирование.

npm_global=~/.npm-global
export NODE_PATH="$npm_global/lib/node_modules${NODE_PATH:+:}$NODE_PATH"
PATH="$npm_global/bin:$PATH"
export MANPATH="$npm_global/share/man:$(unset MANPATH; manpath)"

Наличие export гарантирует, что переменные являются общими для дочерних процессов, которым они могут понадобиться (например, node и man), на тот случай, если они еще не были объявлены или им ранее не был присвоен атрибут экспорта. Указывать экспорт в PATH OTOH очень необязательно.

Я на самом деле нахожу необычным сброс MANPATH перед добавлением к нему значения, потому что некоторые сценарии также могут добавлять к нему пользовательские значения ранее. Я рекомендую, чтобы пользователь удостоверился, что .bashrc или любые другие пользовательские сценарии инициализации, по крайней мере, не добавляют другие строки, подобные этой. Для глобальных конфигураций, я думаю, что путь должен быть добавлен формально через /etc/manpath.config, или что-то подобное, так что это скорее всего другое беспокойство.

Ответ 5

Это почти все, что вам нужно сделать, если вы устанавливаете двоичные утилиты (которые я собираю, так как вы обновили свой PATH).

NODE_PATH нужно только установить, что вы установили модуль, который вы хотите require() из несвязанных node скриптов, но вы все равно не должны этого делать. Модули, которые требуются в качестве зависимостей для других модулей/скриптов, должны быть установлены локально (т.е. Указаны в package.json), так как вы строго контролируете версии.

Изменить: Принятый ответ здесь объясняет это намного лучше, чем я мог: Как установить модуль глобально с помощью npm?

Ответ 6

Ответ Rowno работает для меня, но только после небольшого редактирования на шаг 4:

NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"

и изменил его на:

NODE_PATH="$NPM_PACKAGES/node_modules:$NODE_PATH"

Ответ 7

Попробуйте переключить пользователя:

su - username

Если у вас нет другого пользователя, попробуйте:

useradd username

Затем

su - username