Установите NPM в домашний каталог с помощью пакета распространения nodejs (Ubuntu)

94

Я хотел бы использовать пакеты распространения Node.js (или chris-lea ppa для более поздних выпусков), но установить NPM в свой домашний каталог.

Это может показаться разборчивым, но для разработчиков, использующих полиглот / github, это довольно идиоматический способ настройки языковой среды выполнения / среды библиотеки под Linux: пакеты дистрибутива для среды выполнения, сторонние библиотеки в среде для каждого пользователя (см. Virtualenv, RVM - RVM также создаст для вас Ruby, если хотите). При необходимости я построю узел локально, но это PITA, поскольку узел становится случайным требованием разработки для многих проектов.

Эрик Дрехсел
источник
См. Также stackoverflow.com/questions/19352976/…
Colonel Panic

Ответы:

203

NPM уже установит локальные пакеты в ваши проекты, но мне все же нравится держать систему подальше от файлов моей операционной системы. Вот как я предлагаю разделить пакеты Nodejs:

Установите Nodejs и NPM через chris-lea PPA. Затем я установил корень пакета в моем домашнем каталоге для хранения «глобальных» пакетов узла:

 $ NPM_PACKAGES="$HOME/.npm-packages"
 $ mkdir -p "$NPM_PACKAGES"

Настройте NPM на использование этого каталога для установки глобальных пакетов:

 $ echo "prefix = $NPM_PACKAGES" >> ~/.npmrc

Настройте PATH и MANPATH для просмотра команд в префиксе $ NPM_PACKAGES, добавив следующее в ваш .zshrc / .bashrc:

# NPM packages in homedir
NPM_PACKAGES="$HOME/.npm-packages"

# Tell our environment about user-installed node tools
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 configuration
MANPATH="$NPM_PACKAGES/share/man:$(manpath)"

# Tell Node about these packages
NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"

Теперь, когда вы выполните команду npm install -g, NPM установит библиотеки ~/.npm-packages/lib/node_modulesи свяжет исполняемые инструменты ~/.npm-packages/bin, которые находятся в вашем PATH.

Просто используйте, npm install -gкак обычно:

[justjake@marathon:~] $ npm install -g coffee-script
... (npm downloads stuff) ...
/home/justjake/.npm-packages/bin/coffee -> /home/justjake/.npm-packages/lib/node_modules/coffee-script/bin/coffee
/home/justjake/.npm-packages/bin/cake -> /home/justjake/.npm-packages/lib/node_modules/coffee-script/bin/cake
coffee-script@1.3.3 /home/justjake/.npm-packages/lib/node_modules/coffee-script

[justjake@marathon:~] $ which coffee
/home/justjake/.npm-packages/bin/coffee
Просто Джейк
источник
2
Если вы используете общую систему, где nodeона установлена, но npmне установлена, следуйте инструкциям в приведенном выше ответе, а затем npm_config_prefix=$NPM_PACKAGES curl -L https://npmjs.org/install.sh | shустановите npmсебя в свой домашний каталог.
Тим Льюис
1
Набор префикса у меня не работает на npm 2.10.1, поэтому я закончил работуnpm config set prefix $NPM_PACKAGES
Калин
Следующий скрипт утверждает, что это автоматизирует: github.com/glenpike/npm-g_nosudo
Mike R
$HOME/.localВместо этого я использую приставку. В настоящее время это часто используемая папка другим программным обеспечением для хранения локальных файлов.
Vaibhav K
2
Если вы используете:, echo 'prefix = ${NPM_PACKAGES}' >> ~/.npmrcпуть не задан жестко .npmrc, но npm будет читать его из переменной среды всякий раз, когда запускается npm (обратите внимание, что я изменил "на ', чтобы оболочка, выполняющая эхо, не расширяла переменную, и я добавил {}вокруг переменной , поскольку это синтаксис, используемый в .npmrc. Чтобы эта работа работала, мне пришлось изменить его так, .bashrcчтобы он читал:. export NPM_PACKAGES="$HOME/.npm-packages"Добавление the exportделает его доступным для npm. Несвязано, я думаю, вам нужно будет добавить exportи другие переменные.
Matthijs Kooijman
31

Ответ Джейка был опубликован в 2012 году, и хотя он полезен, он ссылается на PPA Криса Ли на Node.js, которые больше не обновляются с марта 2015 года.

Вот шаги, которые я использую для установки Node.js и npm в мой домашний каталог:

Установите Node.js с помощью nvm ( необязательноsudo ):

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
source ~/.bashrc
nvm install 7
npm install -g npm  # update npm

Теперь вы можете install -gбез него, sudoи все идет в~/.nvm/

Или установите Node.js без nvm ( официальная инструкция ):

Установите Node.js

  • Node.js v6 (текущий LTS по состоянию на май 2017 г.):

    curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
    sudo apt-get install -y nodejs
    
  • Node.js v7:

    curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
    sudo apt-get install -y nodejs
    

Измените каталог по умолчанию npm на локальный:

mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
export PATH="$HOME/.npm-global/bin:$PATH"  # ← put this line in .bashrc
source ~/.bashrc  # if you only updated .bashrc

В качестве альтернативы замените .npm-globalкаталог на ваш выбор.

Обновите npm и убедитесь, что он установлен в вашем $HOMEкаталоге:

$ npm install npm -g
/home/<username>/.npm-global/bin/npm -> /home/<username>/.npm-global/lib/node_modules/npm/bin/npm-cli.js
/home/<username>/.npm-global/lib
└─┬ npm@3.10.6 
  ├─┬ glob@7.0.5 
  │ └── minimatch@3.0.2 
  ├── npm-user-validate@0.1.5 
  └── rimraf@2.5.3 

Теперь вы можете install -gбез sudoи без использования ваших системных файлов.

Максим Р.
источник
Второй вариант также описан на сайте документации NPM: docs.npmjs.com/getting-started/…
Вадим,
6

Решение, опубликованное Just Jake, отличное. Однако из-за ошибки с npm> 1.4.10 он может работать не так, как ожидалось. (Смотрите это и это )

Пока ошибка устранена, вы можете перейти на npm 1.4.10, выполнив следующие действия:

  1. Прокомментируйте строку префикса в вашем $ HOME / .npmrc
  2. Бегать sudo npm install -g npm@1.4.10
  3. Убедитесь, что установлена ​​правильная версия npm ( npm --version)
  4. Раскомментируйте строку префикса в вашем $ HOME / .npmrc
  5. Приступите к установке глобальных пакетов в вашу домашнюю папку !.
user1533401
источник
4

Поскольку python уже отлично справляется со своей задачей virtualenv, я использую nodeenv. По сравнению с nvm, вы можете создать несколько сред для одной и той же версии узла (например, две среды для узла, 0.10но с разными наборами пакетов).

ENVNAME=dev1

#  create an environment
python -m virtualenv ${ENVNAME}

# switch to the newly created env
source ${ENVNAME}/bin/activate

# install nodeenv
pip install nodeenv

# install system's node into virtualenv
nodeenv --node=system --python-virtualenv

Ридми довольно хороший: https://github.com/ekalinin/nodeenv

днозай
источник
3

Некоторое время я использовал решение @ just-jake и обнаружил, что nvm проще настроить. Также это очень мощное решение, которое позволяет устанавливать и использовать разные версии nodejs.

В Ubuntu 14.04 или 16.04:

  1. Установите необходимые пакеты для сборки nodejs:

    sudo apt-get update
    sudo apt-get install build-essential libssl-dev
    
  2. Установите nvm :

    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash
    

    Если будет доступна более новая версия nvm, вы можете найти фактическую команду установки на сайте nvm .

  3. nvmУстановщик добавит сценарий начальной загрузки ~/.bashrc, поэтому вам нужно либо повторно открыть терминал, чтобы запустить его, либо сделать:

    source ~/.bashrc
    
  4. Теперь вы можете установить любую nodejsпонравившуюся версию, переключаться между ними и т. Д.

    Используйте nvm ls-remoteдля вывода списка доступных nodejsверсий.

    Для установки, например, nodejsv4.2.4 выполните:

    # install v4.2.4
    nvm install v4.2.4 
    # use nodejs v4.2.4 in the current terminal session
    nvm use v4.2.4
    # use v4.2.4 by default in new terminal session
    nvm alias default v4.2.4
    
руцкий
источник
2

Чтобы расширить ответ, предоставленный Just Jake и user1533401: я не могу перейти на более раннюю версию, поскольку я использую общий хостинг, а узел установлен в системном каталоге. По этой же причине я изменил каталог, в который npm устанавливает глобальные скрипты, если я хочу, чтобы он это делал. Для тех, кто находится в той же лодке, вот еще одно временное исправление, которое, как я нашел, работает:

npm install -g --prefix=$(npm config get prefix) <package>

Ошибка в том, что npm не читает ваш файл конфигурации для каждого пользователя, но указание его при каждой установке глобального скрипта исправляет это. Нашел здесь .

Барт Лауэрс
источник
0

В других ответах есть устаревшие решения: решение 2020 года использует NPM_CONFIG_PREFIXпеременную среды. ( Подробнее )

Например,

$ NPM_CONFIG_PREFIX="$HOME/.npm-packages" npm install -g ios-sim
/Users/<name>/.npm-packages/bin/ios-sim -> /Users/<name>/.npm-packages/lib/node_modules/ios-sim/bin/ios-sim
+ ios-sim@9.0.0
added 108 packages from 68 contributors in 3.094s
Бёнчан Ли
источник