Installez NPM dans le répertoire personnel avec le package de distribution nodejs (Ubuntu)


93

Je souhaite utiliser les packages de distribution Node.js (ou le chris-lea ppa pour les versions plus récentes) mais installer NPM dans mon répertoire personnel.

Cela peut sembler difficile, mais c'est un moyen assez idiomatique pour les développeurs utilisant des polyglottes / github de configurer des environnements d'exécution / bibliothèque de langage sous Linux: packages de distribution pour l'exécution, bibliothèques tierces dans un environnement par utilisateur (voir virtualenv, RVM - RVM construira également Ruby pour vous si vous le souhaitez). Si nécessaire, je construirai un nœud localement, mais c'est un PITA car Node devient une exigence de développement accessoire pour de nombreux projets.


Réponses:


200

NPM installera déjà des packages locaux dans vos projets, mais j'aime toujours garder le système à l'écart des fichiers de mon système d'exploitation. Voici comment je suggère de compartimenter les packages Nodejs:

Installez Nodejs et NPM via le PPA chris-lea. Ensuite, j'ai configuré une racine de package dans mon homedir pour contenir les packages "globaux" de Node:

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

Configurez NPM pour qu'il utilise ce répertoire pour ses installations globales de package:

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

Configurez votre PATH et MANPATH pour voir les commandes dans votre préfixe $ NPM_PACKAGES en ajoutant ce qui suit à votre .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"

Désormais, lorsque vous effectuez une opération npm install -g, NPM installera les bibliothèques ~/.npm-packages/lib/node_moduleset liera les outils exécutables dans ~/.npm-packages/bin, qui se trouve dans votre fichier PATH.

Utilisez simplement npm install -gcomme vous le feriez normalement:

[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
Si vous êtes sur un système partagé où nodeest installé mais npmn'est pas, suivez la configuration dans la réponse ci - dessus et npm_config_prefix=$NPM_PACKAGES curl -L https://npmjs.org/install.sh | shpour obtenir npmlui - même installé dans votre répertoire personnel.
Tim Lewis

1
L'ensemble du préfixe ne fonctionne pas pour moi sur npm 2.10.1 alors j'ai fini par courirnpm config set prefix $NPM_PACKAGES
Calin

Le script suivant prétend automatiser cela: github.com/glenpike/npm-g_nosudo
Mike R

J'utilise à la $HOME/.localplace pour le préfixe. C'est un dossier couramment utilisé de nos jours par d'autres logiciels pour stocker des fichiers locaux.
Vaibhav K

2
Si vous utilisez: echo 'prefix = ${NPM_PACKAGES}' >> ~/.npmrc, le chemin est pas codé en dur dans .npmrc, mais NPM lira de la variable d'environnement chaque fois exécute NPM (note que je changé "à 'afin d'éviter la coquille qui exécute l'écho de l' élargissement de la variable, et j'ajouté {}autour de la variable , puisque c'est la syntaxe utilisée dans .npmrc. Pour que cela fonctionne, j'ai dû changer .bashrcpour lire export NPM_PACKAGES="$HOME/.npm-packages":. Ajouter le le exportrend disponible à npm. Sans rapport, je pense que vous devrez également ajouter exportaux autres variables.
Matthijs Kooijman

30

La réponse de Jake a été publiée en 2012 et, bien qu'utile, elle fait référence aux PPA Node.js de Chris Lea qui ne sont plus mis à jour depuis mars 2015.

Voici les étapes que j'utilise pour installer Node.js et npm dans mon répertoire personnel:

Installez Node.js avec nvm (non sudorequis):

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

Maintenant tu peux install -gsans sudoet tout entre~/.nvm/

Ou installez Node.js sans nvm ( instructions officielles ):

Installez Node.js

  • Node.js v6 (LTS actuel en mai 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

Remplacez le répertoire par défaut de npm par un répertoire local:

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

Vous pouvez également le remplacer .npm-globalpar le répertoire de votre choix.

Mettez à jour npm et vérifiez qu'il est installé dans votre $HOMErépertoire:

$ 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 

Maintenant, vous pouvez install -gsans sudoet sans déranger vos fichiers système.


La 2ème option est également décrite sur le site de documentation NPM: docs.npmjs.com/getting-started
Vadim

6

La solution publiée par Just Jake est géniale. Cependant, en raison d'un bogue avec npm> 1.4.10, cela peut ne pas fonctionner comme prévu. (Voir ceci et cela )

Pendant que le bogue est résolu, vous pouvez revenir à npm 1.4.10 en suivant ces étapes:

  1. Commentez la ligne de préfixe dans votre $ HOME / .npmrc
  2. Courir sudo npm install -g npm@1.4.10
  3. Assurez-vous que la bonne version de npm est installée ( npm --version)
  4. Décommentez la ligne de préfixe dans votre $ HOME / .npmrc
  5. Continuez à installer vos packages globaux dans votre dossier de départ !.

4

Parce que python fait déjà un excellent travail virtualenv, j'utilise nodeenv. Par rapport à nvm, vous pouvez créer plusieurs environnements pour la même version de nœud (par exemple, deux environnements pour nœud 0.10mais avec différents ensembles de packages).

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

Le readme est plutôt bon: https://github.com/ekalinin/nodeenv


3

J'ai utilisé la solution @ just-jake pendant un certain temps et j'ai trouvé que nvm est plus facile à configurer. C'est aussi une solution très puissante qui permet d'installer et d'utiliser différentes versions de nodejs.

Sur Ubuntu 14.04 ou 16.04:

  1. Installez les packages prérequis pour la construction nodejs:

    sudo apt-get update
    sudo apt-get install build-essential libssl-dev
  2. Installez NVM :

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

    Dans le cas où une version plus récente de nvm serait disponible, vous pouvez trouver la commande d'installation réelle sur le site nvm .

  3. nvml'installateur ajoutera un script d'amorçage à ~/.bashrc, vous devez donc rouvrir le terminal pour l'exécuter, ou faire:

    source ~/.bashrc
  4. Vous pouvez maintenant installer n'importe quel nodejs version de votre choix, basculer entre elles, etc.

    Utiliser nvm ls-remotepour lister les disponiblesnodejs versions .

    Pour installer, par exemple, la 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

Pour développer la réponse fournie par Just Jake et user1533401: Je ne parviens pas à rétrograder car j'utilise l'hébergement partagé et le nœud est installé dans un répertoire système. C'est aussi pourquoi j'ai changé le répertoire où npm installe les scripts globaux si je veux qu'il le fasse. Pour ceux qui sont dans le même bateau, voici une autre solution temporaire que j'ai trouvée:

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

Le bogue est que npm ne lit pas votre fichier de configuration par utilisateur, mais le spécifier à chaque fois que vous installez un script global corrige cela. Trouvé ici .


2

Comme indiqué déjà ici et ici

npm config set prefix ~
echo export PATH=\$PATH:\~/bin >> ~/.bashrc
. ~/.bashrc

0

D'autres réponses ont des solutions obsolètes: la solution de 2020 utilise NPM_CONFIG_PREFIXune variable d'environnement. (Voir détails )

Par exemple,

$ 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.