Instale NPM en el directorio de inicio con el paquete de distribución nodejs (Ubuntu)

94

Me gustaría usar los paquetes de distribución Node.js (o chris-lea ppa para versiones más recientes) pero instalar NPM en mi directorio de inicio.

Esto puede parecer delicado, pero es una forma bastante idiomática para que los desarrolladores que usan políglotas / github configuren entornos de tiempo de ejecución / biblioteca del lenguaje en Linux: paquetes de distribución para el tiempo de ejecución, bibliotecas de terceros en el entorno por usuario (consulte virtualenv, RVM - RVM también construirá Ruby para usted si lo desea). Si es necesario, construiré un nodo localmente, pero es un PITA ya que Node se está convirtiendo en un requisito de desarrollo incidental para muchos proyectos.

Eric Drechsel
fuente
Véase también stackoverflow.com/questions/19352976/…
Colonel Panic

Respuestas:

203

NPM ya instalará paquetes locales en sus proyectos, pero todavía me gusta mantener el sistema alejado de los archivos de mi sistema operativo. Así es como sugiero compartimentar los paquetes de Nodejs:

Instale Nodejs y NPM a través del PPA chris-lea. Luego configuré una raíz de paquete en mi homedir para contener los paquetes "globales" de Nodo:

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

Configure NPM para usar este directorio para las instalaciones de su paquete global:

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

Configure su PATH y MANPATH para ver los comandos en su prefijo $ NPM_PACKAGES agregando lo siguiente a su .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"

Ahora, cuando haga una npm install -g, NPM instalará las bibliotecas ~/.npm-packages/lib/node_modulesy vinculará las herramientas ejecutables en ~/.npm-packages/bin, que está en su PATH.

Solo use npm install -gcomo lo haría normalmente:

[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
Solo jake
fuente
2
Si está en un sistema compartido donde nodeestá instalado pero npmno lo está, siga la configuración en la respuesta anterior y luego npm_config_prefix=$NPM_PACKAGES curl -L https://npmjs.org/install.sh | shpara npminstalarse en su directorio de inicio.
Tim Lewis
1
El conjunto del prefijo no me funciona en npm 2.10.1, así que terminé ejecutandonpm config set prefix $NPM_PACKAGES
Calin
El siguiente script pretende automatizar esto: github.com/glenpike/npm-g_nosudo
Mike R
Yo uso $HOME/.localen su lugar para el prefijo. Es una carpeta de uso común hoy en día por otro software para almacenar archivos locales.
Vaibhav K
2
Si usa:, echo 'prefix = ${NPM_PACKAGES}' >> ~/.npmrcla ruta no está codificada .npmrc, pero npm la leerá desde la variable de entorno cada vez que se ejecute npm (tenga en cuenta que cambié "a 'para evitar que el shell que ejecuta el eco expanda la variable, y agregué {}alrededor de la variable , ya que esa es la sintaxis utilizada en .npmrc. Para que esto funcione, tuve que cambiar .bashrcpara leer:. export NPM_PACKAGES="$HOME/.npm-packages"Agregar el exporthace que esté disponible para npm. Sin relación, creo que debería agregar exporta las otras variables también.
Matthijs Kooijman
31

La respuesta de Jake se publicó en 2012 y, si bien es útil, hace referencia a los PPA Node.js de Chris Lea, que ya no se actualizan desde marzo de 2015.

Estos son los pasos que utilizo para instalar Node.js y npm en mi directorio de inicio:

Instale Node.js con nvm (no es sudonecesario):

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

Ahora puedes install -gsin sudoy todo entra~/.nvm/

O instale Node.js sin nvm ( instrucciones oficiales ):

Instalar Node.js

  • Node.js v6 (LTS actual a mayo de 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
    

Cambie el directorio predeterminado de npm a uno 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

Alternativamente, reemplácelo .npm-globalpor el directorio de su elección.

Actualice npm y verifique que esté instalado en su $HOMEdirectorio:

$ 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
└─┬ [email protected] 
  ├─┬ [email protected] 
  │ └── [email protected] 
  ├── [email protected] 
  └── [email protected] 

Ahora puede hacerlo install -gsin sudoy sin meterse con los archivos de su sistema.

Maxime R.
fuente
La segunda opción también se describe en el sitio de documentos de NPM: docs.npmjs.com/getting-started/…
Vadim
6

La solución publicada por Just Jake es excelente. Sin embargo, debido a un error con npm> 1.4.10, es posible que no funcione como se esperaba. (Ver esto y esto )

Mientras se resuelve el error, puede cambiar a npm 1.4.10 siguiendo estos pasos:

  1. Comente la línea de prefijo en su $ HOME / .npmrc
  2. correr sudo npm install -g [email protected]
  3. Asegúrese de que esté instalada la versión correcta de npm (npm --version )
  4. Descomente la línea de prefijo en su $ HOME / .npmrc
  5. ¡Proceda a instalar sus paquetes globales en su carpeta de inicio !.
usuario1533401
fuente
4

Debido a que Python ya hace un gran trabajo virtualenv, uso nodeenv. En comparación con nvm, puede crear varios entornos para la misma versión de nodo (por ejemplo, dos entornos para el nodo 0.10pero con diferentes conjuntos de paquetes).

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

El archivo Léame es bastante bueno: https://github.com/ekalinin/nodeenv

dnozay
fuente
3

Usé la solución @ just-jake durante algún tiempo y descubrí que nvm es más fácil de configurar. También es una solución muy poderosa que permite instalar y usar diferentes versiones de nodejs.

En Ubuntu 14.04 o 16.04:

  1. Instale los paquetes de requisitos previos para la construcción nodejs:

    sudo apt-get update
    sudo apt-get install build-essential libssl-dev
    
  2. Instalar nvm :

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

    En caso de que haya disponible una versión más reciente de nvm, puede encontrar el comando de instalación real en el sitio de nvm .

  3. nvmEl instalador agregará un script de arranque a ~/.bashrc, por lo que debe volver a abrir el terminal para ejecutarlo o hacer:

    source ~/.bashrc
    
  4. Ahora puede instalar cualquier nodejsversión que desee, cambiar entre ellas, etc.

    Úselo nvm ls-remotepara enumerar las nodejsversiones disponibles .

    Para instalar, por ejemplo, nodejsv4.2.4 , haga lo siguiente:

    # 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
    
rutsky
fuente
2

Para ampliar la respuesta proporcionada por Just Jake y user1533401: No puedo degradar porque uso alojamiento compartido y el nodo está instalado en un directorio del sistema. Esta es también la razón por la que cambié el directorio donde npm instala los scripts globales si quiero que lo haga. Para aquellos en el mismo barco, aquí hay otra solución temporal que encontré que funciona:

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

El error es que npm no lee su archivo de configuración por usuario, pero especificarlo cada vez que instala un script global lo corrige. Encontrado aquí .

Bart Louwers
fuente
2

Como ya se dijo aquí y aquí

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

Otras respuestas tienen soluciones obsoletas: la solución de 2020 está utilizando NPM_CONFIG_PREFIXla variable de entorno. (Ver detalles )

Por ejemplo,

$ 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
+ [email protected]
added 108 packages from 68 contributors in 3.094s
Byoungchan Lee
fuente