Installa NPM nella home directory con il pacchetto nodejs di distribuzione (Ubuntu)


93

Vorrei utilizzare i pacchetti di distribuzione Node.js (o chris-lea ppa per le versioni più recenti) ma installare NPM nella mia home directory.

Questo può sembrare pignolo, ma è un modo piuttosto idiomatico per gli sviluppatori che usano polyglot / github per configurare ambienti di runtime / libreria di linguaggio sotto Linux: pacchetti distro per il runtime, librerie di terze parti in ambiente per utente (vedi virtualenv, RVM - RVM creerà anche Ruby per te se lo desideri). Se necessario, costruirò il nodo localmente ma è un PITA poiché Node sta diventando un requisito di sviluppo incidentale per molti progetti.


Risposte:


200

NPM installerà già i pacchetti locali nei tuoi progetti, ma mi piace comunque tenere il sistema lontano dai file del mio sistema operativo. Ecco come suggerisco di compartimentalizzare i pacchetti Nodejs:

Installa Nodejs e NPM tramite chris-lea PPA. Quindi ho impostato una radice del pacchetto nella mia homedir per contenere i pacchetti "globali" del nodo:

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

Imposta NPM per utilizzare questa directory per le installazioni dei pacchetti globali:

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

Configura il tuo PATH e MANPATH per vedere i comandi nel tuo prefisso $ NPM_PACKAGES aggiungendo quanto segue al tuo .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"

Ora, quando npm install -gesegui un , NPM installerà le librerie ~/.npm-packages/lib/node_modulese collegherà gli strumenti eseguibili in ~/.npm-packages/bin, che è nel tuo file PATH.

Usa npm install -gcome faresti 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

2
Se sei su un sistema condiviso in cui nodeè installato ma npmnon lo è, segui la configurazione nella risposta sopra e poi npm_config_prefix=$NPM_PACKAGES curl -L https://npmjs.org/install.sh | shper npminstallarsi nella tua home directory.
Tim Lewis

1
Il set del prefisso non funziona per me su npm 2.10.1 quindi ho finito per correrenpm config set prefix $NPM_PACKAGES
Calin

Il seguente script afferma di automatizzare questo: github.com/glenpike/npm-g_nosudo
Mike R

Uso $HOME/.localinvece per il prefisso. È una cartella comunemente usata oggi da altri software per archiviare file locali.
Vaibhav K

2
Se si utilizza: echo 'prefix = ${NPM_PACKAGES}' >> ~/.npmrcil percorso non è codificato in .npmrc, ma NPM lo leggerà dalla variabile d'ambiente ogni volta che viene eseguito NPM (nota che ho cambiato "per 'al fine di evitare che la shell che esegue l'eco di espandersi variabile, e ho aggiunto {}tutto il variabile , poiché questa è la sintassi utilizzata in .npmrc. Per far funzionare questo, ho dovuto cambiare .bashrcper leggere:. export NPM_PACKAGES="$HOME/.npm-packages"L'aggiunta di lo exportrende disponibile a npm. Non correlato, penso che dovresti aggiungere anche exportalle altre variabili.
Matthijs Kooijman

30

La risposta di Jake è stata pubblicata nel 2012 e, sebbene utile, fa riferimento ai PPA Node.js di Chris Lea che non sono più aggiornati da marzo 2015.

Ecco i passaggi che utilizzo per installare Node.js e npm nella mia directory home:

Installare Node.js con NVM (senza sudorichiesto):

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

Ora puoi install -gsenza sudoe tutto va bene~/.nvm/

Oppure installa Node.js senza nvm ( istruzioni ufficiali ):

Installa Node.js

  • Node.js v6 (attuale LTS a maggio 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
    

Cambia la directory predefinita di npm in una locale:

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

In alternativa, sostituisci .npm-globalcon la directory di tua scelta.

Aggiorna npm e controlla che sia installato nella tua $HOMEdirectory:

$ 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 

Ora puoi install -gsenza sudoe senza scherzare con i tuoi file di sistema.


La seconda opzione è descritta anche sul sito della documentazione di NPM: docs.npmjs.com/getting-started/…
Vadim

6

La soluzione pubblicata da Just Jake è fantastica. Tuttavia, a causa di un bug con npm> 1.4.10, potrebbe non funzionare come previsto. (Vedi questo e questo )

Mentre il bug è stato risolto, puoi eseguire il downgrade a npm 1.4.10 seguendo questi passaggi:

  1. Commenta la riga del prefisso nel tuo $ HOME / .npmrc
  2. Correre sudo npm install -g npm@1.4.10
  3. Assicurati che sia installata la versione corretta di npm ( npm --version)
  4. Rimuovi il commento dalla riga del prefisso in $ HOME / .npmrc
  5. Procedi con l'installazione dei tuoi pacchetti globali nella tua cartella home !.

4

Poiché python fa già un ottimo lavoro virtualenv, io uso nodeenv. Rispetto a nvm, è possibile creare più ambienti per la stessa versione del nodo (ad esempio due ambienti per il nodo 0.10ma con diversi set di pacchetti).

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

Il file readme è abbastanza buono: https://github.com/ekalinin/nodeenv


3

Ho usato @ just-jake soluzione per un certo tempo e ha scoperto che NVM è più facile da configurare. Inoltre è una soluzione molto potente che consente di installare e utilizzare diverse versioni di nodejs.

Su Ubuntu 14.04 o 16.04:

  1. Installa i pacchetti prerequisiti per la creazione nodejs:

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

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

    Nel caso in cui sia disponibile una versione più recente di nvm, è possibile trovare il comando di installazione effettivo sul sito nvm .

  3. nvmil programma di installazione aggiungerà lo script di bootstrap a ~/.bashrc, quindi è necessario riaprire il terminale per eseguirlo o:

    source ~/.bashrc
  4. Ora puoi installare qualsiasi nodejsversione tu voglia, passare da una all'altra, ecc.

    Utilizzare nvm ls-remoteper elencare le nodejsversioni disponibili .

    Per installare, ad esempio, nodejsv4.2.4 fai:

    # 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

Per espandere la risposta fornita da Just Jake e user1533401: non sono in grado di eseguire il downgrade poiché utilizzo l'hosting condiviso e il nodo è installato in una directory di sistema. Questo è anche il motivo per cui ho cambiato la directory in cui npm installa gli script globali se voglio che lo faccia. Per quelli sulla stessa barca, ecco un'altra soluzione temporanea che ho trovato funziona:

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

Il bug è che npm non legge il tuo file di configurazione per utente, ma specificarlo ogni volta che installi uno script globale lo risolve. Trovato qui .


2

Come già affermato qui e qui

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

0

Altre risposte hanno soluzioni obsolete: la soluzione del 2020 utilizza NPM_CONFIG_PREFIXla variabile d'ambiente. (Vedi dettagli )

Per esempio,

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.