Встановіть NPM у домашній каталог із пакунком розподілу nodejs (Ubuntu)


94

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

Це може здатися вибагливим, але це досить ідіоматичний спосіб для розробників, що використовують polyglot / github, налаштувати середовища виконання / бібліотеки мови під Linux: дистрибутивні пакети для середовища виконання, сторонні бібліотеки в середовищі для кожного користувача (див. Virtualenv, RVM - RVM також побудує для вас Ruby, якщо хочете). Якщо потрібно, я буду локально node, але це PITA, оскільки Node стає випадковою вимогою до розробки для багатьох проектів.


Відповіді:


203

NPM вже встановить локальні пакети у ваші проекти, але я все одно хочу тримати систему подалі від файлів моєї операційної системи. Ось як я пропоную розподілити пакети Nodejs:

Встановіть Nodejs та NPM через chris-lea PPA. Потім я встановив корінь пакета в моєму homedir для зберігання "глобальних" пакетів Node:

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

Наступний сценарій претендує на автоматизацію цього: github.com/glenpike/npm-g_nosudo
Mike R

Я використовую $HOME/.localзамість цього префікс. Це часто використовувана папка іншим програмним забезпеченням для зберігання локальних файлів.
Vaibhav K

2
Якщо ви використовуєте: echo 'prefix = ${NPM_PACKAGES}' >> ~/.npmrc, шлях не зашитий в .npmrc, але НПЙ прочитають з змінного оточення , коли НПЕ працюю (примітка я змінив , "щоб 'для того , щоб запобігти оболонку , яка виконує відлуння від розширення змінного, і я додав {}навколо змінного , оскільки це синтаксис, який використовується в .npmrc. Щоб зробити цю роботу, мені довелося змінити .bashrcчитання:. export NPM_PACKAGES="$HOME/.npm-packages"Додавання exportробить його доступним для npm. Непов’язане, я думаю, вам також потрібно буде додати exportдо інших змінних.
Matthijs Kooijman

31

Відповідь Джейка була опублікована в 2012 році, і хоча вона корисна, вона посилається на PPA Node.js Chris Lea, які більше не оновлюються з березня 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. Продовжуйте встановлювати глобальні пакети у домашній папці !.

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

Я використовував @ тільки-Джейк рішення в протягом деякого часу , і виявили , що 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. nvminstaller додасть скрипт bootstrap ~/.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

Щоб розширити відповідь, надану Просто Джейком та користувачем1533401: Я не можу перейти на нижчу версію, оскільки використовую спільний хостинг, а вузол встановлений у системному каталозі. Ось чому я маю змінити каталог, де 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.