Instale o NPM no diretório inicial com o pacote de distribuição nodejs (Ubuntu)


93

Gostaria de usar os pacotes Node.js de distribuição (ou o chris-lea ppa para versões mais recentes), mas instalar o NPM em meu diretório inicial.

Isso pode parecer exigente, mas é uma maneira bastante idiomática para desenvolvedores poliglotas / github-using para configurar ambientes de runtime / biblioteca de linguagem no Linux: pacotes de distro para o tempo de execução, bibliotecas de terceiros em ambiente por usuário (consulte virtualenv, RVM - RVM também criará Ruby para você, se desejar). Se necessário, construirei o nó localmente, mas é um PITA, já que o Node está se tornando um requisito de desenvolvimento incidental para muitos projetos.


Respostas:


200

O NPM já instalará pacotes locais em seus projetos, mas ainda gosto de manter o sistema longe dos arquivos do meu sistema operacional. Eis como sugiro compartimentar os pacotes Nodejs:

Instale o Nodejs e o NPM por meio do PPA chris-lea. Então eu configurei uma raiz de pacote em meu homedir para conter os pacotes "globais" do Node:

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

Defina o NPM para usar este diretório para suas instalações de pacote globais:

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

Configure seu PATH e MANPATH para ver os comandos no prefixo $ NPM_PACKAGES adicionando o seguinte ao seu .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"

Agora, quando você fizer um npm install -g, o NPM instalará as bibliotecas ~/.npm-packages/lib/node_modulese vinculará as ferramentas executáveis ​​ao ~/.npm-packages/bin, que está em seu PATH.

Basta usar npm install -gcomo faria 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 você estiver em um sistema compartilhado onde nodeestá instalado, mas npmnão está, siga a configuração na resposta acima e, em seguida, npm_config_prefix=$NPM_PACKAGES curl -L https://npmjs.org/install.sh | shfaça com que npmseja instalado em seu diretório pessoal.
Tim Lewis

1
O conjunto do prefixo não está funcionando para mim no npm 2.10.1, então acabei executandonpm config set prefix $NPM_PACKAGES
Calin

O script a seguir afirma automatizar isso: github.com/glenpike/npm-g_nosudo
Mike R

Eu uso em $HOME/.localvez disso para o prefixo. É uma pasta comumente usada hoje em dia por outro software para armazenar arquivos locais.
Vaibhav K

2
Se você usar :, echo 'prefix = ${NPM_PACKAGES}' >> ~/.npmrco caminho não é codificado em .npmrc, mas o npm o lerá da variável de ambiente sempre que o npm for executado (observe que mudei "para a 'fim de evitar que o shell que executa o eco expanda a variável e adicionei em {}torno da variável , já que essa é a sintaxe usada em .npmrc. Para fazer este trabalho, eu tive que alterar .bashrcpara ler:. export NPM_PACKAGES="$HOME/.npm-packages"Adicionar o exporttorna disponível para npm. Não relacionado, acho que você precisaria adicionar exportoutras variáveis ​​também.
Matthijs Kooijman

30

A resposta de Jake foi postada em 2012 e, embora útil, faz referência aos PPAs Node.js de Chris Lea que não são mais atualizados desde março de 2015.

Estas são as etapas que utilizo para instalar o Node.js e o npm no meu diretório inicial:

Instale o Node.js com nvm (não é sudonecessário):

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

Agora você pode install -gsem sudoe tudo vai para~/.nvm/

Ou instale o Node.js sem nvm ( instruções oficiais ):

Instale Node.js

  • Node.js v6 (LTS atual em maio 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

Altere o diretório padrão do npm para um 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, substitua .npm-globalpelo diretório de sua escolha.

Atualize o npm e verifique se ele está instalado no seu $HOMEdiretório:

$ 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 

Agora você pode, install -gsem sudoe sem bagunçar seus arquivos de sistema.


A segunda opção também é descrita no site de documentos do NPM: docs.npmjs.com/getting-started/…
Vadim

6

A solução postada por Just Jake é ótima. No entanto, devido a um bug com npm> 1.4.10, pode não funcionar como esperado. (Veja isto e isto )

Enquanto o bug é resolvido, você pode fazer o downgrade para npm 1.4.10 seguindo estas etapas:

  1. Comente a linha de prefixo em seu $ HOME / .npmrc
  2. Corre sudo npm install -g npm@1.4.10
  3. Certifique-se de que a versão correta do npm está instalada ( npm --version)
  4. Remova o comentário da linha de prefixo em seu $ HOME / .npmrc
  5. Prossiga para instalar seus pacotes globais em sua pasta pessoal !.

4

Porque python já faz um ótimo trabalho virtualenv, eu uso nodeenv. Em comparação com nvm, você pode criar vários ambientes para a mesma versão de nó (por exemplo, dois ambientes para nó, 0.10mas com diferentes conjuntos de pacotes).

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

O leia-me é muito bom: https://github.com/ekalinin/nodeenv


3

Usei a solução @ just-jake por algum tempo e descobri que o nvm é mais fácil de configurar. Também é uma solução muito poderosa que permite instalar e usar diferentes versões do nodejs.

No Ubuntu 14.04 ou 16.04:

  1. Instale os pacotes de pré-requisitos para a construção nodejs:

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

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

    No caso de uma versão mais recente do nvm estar disponível, você pode encontrar o comando de instalação real no site do nvm .

  3. nvmo instalador adicionará o script de bootstrap ao ~/.bashrc, então você precisa reabrir o terminal para executá-lo ou fazer:

    source ~/.bashrc
  4. Agora você pode instalar qualquer nodejsversão que desejar, alternar entre elas etc.

    Use nvm ls-remotepara listar as nodejsversões disponíveis .

    Para instalar, por exemplo, nodejsv4.2.4 faça:

    # 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

Para expandir a resposta fornecida por Just Jake e usuário1533401: Não consigo fazer o downgrade porque uso hospedagem compartilhada e o nó está instalado em um diretório do sistema. É também por isso que alterei o diretório em que o npm instala scripts globais, se quiser que ele faça isso. Para quem está no mesmo barco, aqui está outra solução temporária que achei que funciona:

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

O bug é que o npm não lê seu arquivo de configuração por usuário, mas especificá-lo toda vez que você instala um script global corrige isso. Encontrado aqui .


2

Como já foi dito aqui e aqui

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

0

Outras respostas têm soluções desatualizadas: a solução de 2020 está usando NPM_CONFIG_PREFIXa variável de ambiente. (Ver detalhes )

Por exemplo,

$ 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.