Os módulos NPM não serão instalados globalmente sem o sudo

126

Acabei de reinstalar o Ubuntu 12.04 LTS e, antes de mais nada, executei estas etapas :

  1. Nó instalado via gerenciador de pacotes com o seguinte script

    sudo apt-get update
    
    sudo apt-get install python-software-properties python g++ make
    
    sudo add-apt-repository ppa:chris-lea/node.js
    
    sudo apt-get update
    
    sudo apt-get install nodejs
  2. Tentou instalar os geradores da yeoman, express, n, da yoman globalmente e todos eles retornaram o mesmo erro

    npm ERR! Erro: EACCES, link simbólico '../lib/node_modules/n/bin/n'

    npm ERR! {[Erro: EACCES, link simbólico '../lib/node_modules/n/bin/n'] errno: 3, código: 'EACCES', caminho: '../lib/node_modules/n/bin/n'}

    npm ERR!

    npm ERR! Por favor, tente executar este comando novamente como root / Administrator.

    npm ERR! Sistema Linux 3.8.0-29-generic

    npm ERR! comando "/ usr / bin / node" "/ usr / bin / npm" "install" "-g" "-d" "n"

    npm ERR! cwd / home / heberlz

    npm ERR! nó -v v0.10.20

    npm ERR! npm -v 1.3.11

    npm ERR! caminho ../lib/node_modules/n/bin/n

    npm ERR! código EACCES

    npm ERR! errno 3

    npm ERR! Erro na pilha: EACCES, link simbólico '../lib/node_modules/n/bin/n'

    npm ERR!

    npm ERR! Detalhes adicionais de registro podem ser encontrados em:

    npm ERR! /home/heberlz/npm-debug.log

    npm ERR! código não ok 0

  3. Propriedade recuperada das seguintes pastas recursivamente ~ / .npm, / usr / lib / node, / usr / lib / node_modules e dos seguintes links simbólicos / usr / bin / node, / usr / bin / nodejs sem sucesso

Preciso instalar o yeoman e seus geradores sem sudo para não ter problemas mais tarde :(

HeberLZ
fonte
Graças Phil, agora parece muito melhor
HeberLZ
2
Se você quiser npm para instalar pacotes globais em $ HOME em vez de / usr, siga o guia github.com/sindresorhus/guides/blob/master/...
Coronel Pânico
isto é o que funcionou para mim github.com/nodejs/node-v0.x-archive/issues/… :ln -s /usr/bin/nodejs /usr/bin/node
Loïc MICHEL
Possível duplicado de npm lança erro sem sudo
Louis

Respostas:

318

Ubuntu 12.04 e usando o PPA de Chris Lea para instalar o seguinte funciona para mim:

npm config set prefix '~/.npm-packages'

e adicionando $ HOME / .npm-packages / bin a $ PATH

anexar a .bashrc

export PATH="$PATH:$HOME/.npm-packages/bin"

consulte https://stackoverflow.com/a/18277225 de @passy

ErikAndreas
fonte
9
Parece uma solução muito mais limpa. Se você não gosta de pastas do sistema no diretório inicial, também pode usar um local como ~ / .local / share / npm.
JeroenHoek #
Deve-se observar que, depois de alterar o prefixo, você deve reinstalar todos os módulos globais que você instalou anteriormente, incluindo o próprio npm.
Dziamid
Isso parece bom, mas achei muito mais fácil dar permissão ao usuário para escrever /usr/lib/node_modules/. Ou talvez até apropriado criar um grupo nodejs unix e conceder a esse grupo permissão para gravar nesse diretório.
precisa saber é o seguinte
Um pequeno detalhe a ser adicionado é que você deve criar o diretório ~ / npm. Senão, o npm sairá com erros ENOENT.
Jason Farnsworth
6
Por que esse não é o padrão para npm? Obrigado por compartilhar.
Dorian
23

Se você já está $HOME/binno seu caminho, uma solução mais simples é apenas ...

npm config set prefix ~
  • Novos comandos do nó serão instalados no seu $HOME/bindiretório.
  • Não há necessidade de mudar seu caminho!

Como essa discussão é realmente sobre a redução dos riscos de segurança da execução sudo, você também deve estar ciente de que qualquer aplicativo de nó pode estar instalando um nome de aplicativo que não corresponde ao nome do pacote de nó registrado que você pensa que está instalando. Portanto, há um risco de segurança de que um npm installsubstitua um comando do sistema existente ou um que você já possui $HOME/bin. Se estiver preocupado, verifique as propriedades bine scriptsno package.jsonarquivo do aplicativo que você está instalando primeiro.

Em geral, é mais seguro:

  • (a) Coloque o $HOME/binúltimo no caminho para que os comandos do sistema não sejam substituídos.
  • (b) não inclua "." ou qualquer caminho relativo no seu, $PATHpara que você não execute acidentalmente um comando que esteja no diretório atual.

Referência:

Tony O'Hagan
fonte
1
Outro problema de segurança importante npmé que o código-fonte que você vê em um github.comrepositório para um pacote de nós pode não ser o mesmo código que você está instalando no npm.orgservidor de registro!
Tony O'Hagan
Embora, em teoria, um pacote de nó bem criado seja instalado com facilidade ~/bin, alguns pacotes de nós (ou seus pacotes dependentes) foram testados apenas como instalação, sudoportanto, esteja ciente de que você pode encontrar um problema não testado do "ambiente de instalação". Como qualquer outro problema de ambiente (como mudança de SO), o princípio de "escreva uma vez, teste em qualquer lugar" ainda é válido.
Tony O'Hagan
A desvantagem desse método é que o npm cria um diretório adicional, chamado ~ / lib. Dependendo das práticas da sua organização, isso pode não ser desejável.
Mr. S
13

Em outubro de 2014:

O Node.js está disponível no repositório de distribuições binárias NodeSource Debian e Ubuntu .

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

É isso aí.

Resposta desatualizada:

A maneira mais rápida sem usar o sudo é como descrito aqui por isaac

Eu recomendo fortemente que você não faça o gerenciamento de pacotes com o sudo! Os pacotes podem executar scripts arbitrários, o que torna o sudo um comando do gerenciador de pacotes tão seguro quanto um corte de cabelo em uma serra elétrica. Claro, é rápido e definitivamente vai superar todos os obstáculos, mas você pode realmente querer que esse obstáculo permaneça lá.

Eu recomendo fazer isso uma vez:

sudo chown -R $USER /usr/local

EDITAR:

Existem algumas preocupações de segurança e limitações de funcionalidade relacionadas à alteração da propriedade de / usr / local para o usuário atual:

Dito isto, se você deseja instalar o módulo global sem usar o sudo, não vejo melhor solução (do ponto de vista pragmático) do que o mencionado. Segurança vs fácil de usar é um tópico muito amplo, e não há uma resposta fácil para isso - depende apenas de seus requisitos.

Andrei Karpushonak
fonte
23
Essa é uma péssima idéia, pois faz com que todos os / usr / locais pertençam a um único usuário.
Reed G. Lei
4
Como o @ ReedG.Law apontou, essa é realmente uma péssima idéia. Não altere a propriedade de / usr / local para nenhum usuário específico.
Christopher Will
3
Eu tenho que concordar com Reed G Law - mudar / usr / local é uma idéia MAU MAU. No meu caso, eu estava olhando para as direções e o fiz: depois lembrei que tenho que COMPARTILHAR isso com outra pessoa que está desenvolvendo. Voltei e (espero) recebi todas as alterações. Não é apenas segurança, mas funcionalidade também.
Lloyd Sargent
3
Existe alguma desvantagem nessa solução se houver apenas um usuário no sistema?
connorbode
2
Desculpe, quis dizer /usr/local/lib/node_modulesenode
Creynders
11

O problema foi que eu instalei o nó usando o sudo , para evitar erros ao instalar os módulos npm globalmente, DEVE NUNCA instalar o nó com o sudo.

Minha solução foi reinstalar o nó desta maneira:

Faça o download das fontes de nó estáveis ​​mais recentes em nodejs.org #no meu caso node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz #uncompress sources

cd node-v0.10.20 #enter pasta descompactada

sudo chown -R $ USER / usr / local

./configure --prefix = / usr / local && make && make install

Uma coisa a notar é que apenas a propriedade da pasta / usr / local não funcionaria no meu caso porque a instalação do nó foi feita com o sudo

Último passo para instalar o yeoman: # apesar de em yeoman.io dizer que fazer "npm install -g yo" já instala o bower e o grunhido, existem alguns sub-módulos de grunhido que falham, então eu o corrigi instalando-o sozinho

npm install -g bower

npm install -g grunt

npm install -g yo

npm install -g generator-angular

HeberLZ
fonte
Ótimo em teoria, mas existe alguma maneira de obter o mesmo efeito sem ser forçado a construir o Node e instalar 4 módulos adicionais apenas para ter acesso a módulos globalmente?
Dan Nissenbaum
A resposta selecionada funciona exatamente como você precisa. Isto é o que eu fiz 2 anos atrás, quando não havia outra solução público ainda, mas agora é inútil
HeberLZ
5

Resolvi esse problema com a variável de ambiente e o alias do shell:

export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"

Para mim, o npm não respeitou a configuração "prefix" no .npmrc.

santervo
fonte
2

De acordo com este post SO semelhante: o npm lança um erro sem o sudo

Parece que você pode ter um problema de propriedade com o ~/.npmdiretório.

Como na resposta, tente:

sudo chown -R `whoami` ~/.npm
prasanthv
fonte
Na verdade, isso não funcionou, como expliquei na etapa 3 do que tentei quando não consegui fazê-lo funcionar. O problema era que instalei o nó usando o sudo, o que pode, em algumas circunstâncias, causar problemas. Depois de excluir o nó e reinstalá-lo de suas fontes, tudo começou a funcionar como esperado!
HeberLZ
@HeberLZ Acho que você está certo, tentei fazer isso em outra máquina ontem à noite e não estava funcionando. Também tive outros problemas de permissão para lidar. Ainda não tenho certeza de qual é a melhor maneira de não executar esse npm de instalação a partir do código-fonte.
Prasanthv 06/04
Vincule à pergunta nos comentários ou marque a pergunta atual como duplicada. Não ajuda copiar e colar respostas de outras perguntas.
givanse
@HeberLZ, o voto negativo desta resposta é inadequado, pois aborda o título da pergunta que você fez.
Sebastian Sastre
Não me lembro de quando diminuí a votação da resposta, mas, no meu caso particular, o que você escreveu não corrigiu o problema, pelo que acho que provavelmente diminuiu a resposta. Conforme declarado na pergunta: "Propriedade recuperada das seguintes pastas recursivamente ~ / .npm, / usr / lib / node, / usr / lib / node_modules e dos seguintes links simbólicos / usr / bin / node, / usr / bin / nodejs com absolutamente nenhum sucesso "Eu tentei obter a propriedade do .npm e de todas as outras pastas sem sucesso
HeberLZ
2

Encontre o caminho para o diretório do npm:

npm config get prefix

Para muitos sistemas, este será / usr / local.

Mude o proprietário dos diretórios do npm para o nome do usuário atual (seu nome de usuário!):

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

Isso altera as permissões das subpastas usadas pelo npm e algumas outras ferramentas (lib / node_modules, bin e share).

Aqui está o link para mais detalhes

https://docs.npmjs.com/getting-started/fixing-npm-permissions

Monis Majeed
fonte
Vital. Tente evitar adicionar bine shareentre parênteses. Ignorar pode levar à alteração da propriedade dessas pastas para o usuário atual e a problemas na instalação de novos pacotes no sistema, sudoporque a propriedade também será alterada
A.Ametov
Este elogio destrói todo o meu sistema de arquivos: (
UA_
1

Se você estiver em uma máquina em desenvolvimento, é melhor considerar o uso do nvm .

Caso contrário, você simplesmente deseja instalar usando seu gerenciador de pacotes favorito.

Seja qual for o caso, recomendo verificar esta resposta no stackoverflow

Iam Zesh
fonte
1

Na verdade, acabei de alterar a permissão de uma pasta de usuário pertencente ao root:

sudo chown -R $USER ~/.config/configstore

Então eu poderia "npm install" e "bower install" sem o sudo! Funcionou bem!

Vinggui
fonte
0

Usando o lubuntu 14.04.3, tentei alterar a propriedade do prefixo .npm e npm, atualizei o meu caminho, o npm instalou os módulos no meu diretório home sem o sudo, mas o caminho estava incorreto para que os módulos como brasa não fossem encontrados, o linuxbew resolveu o problema rapidamente guia de configuração aqui para o nó / npm

Conor
fonte
0

Esse problema e outro causado pelo mesmo motivo podem ser resolvidos instalando o Node no espaço do usuário.

Você pode fazer isso apenas copiando e colando no seu terminal

NODEJS_ROOT=${NODEJS_ROOT:-~/nodejs}
cd /tmp
wget -N http://nodejs.org/dist/node-latest.tar.gz && tar xzf node-latest.tar.gz
NODEJS_CURRENT=$(tar tf node-latest.tar.gz|head -1)
mkdir -p $NODEJS_ROOT/$NODEJS_CURRENT
cd $NODEJS_CURRENT
./configure --prefix=$NODEJS_ROOT/$NODEJS_CURRENT && make install
cd $NODEJS_ROOT
rm current 2> /dev/null # Removes current symbolic link, if any
ln -s $NODEJS_CURRENT current

Os mesmos comandos podem ser iniciados também para atualizar o Node para a versão mais recente.

Não se esqueça de editar seu ambiente. Apenas uma vez, faça

echo "export NODEJS_ROOT=$NODEJS_ROOT"            >> $HOME/.bash_profile
echo 'export PATH=$NODEJS_ROOT/current/bin:$PATH' >> $HOME/.bash_profile
source $HOME/.bash_profile # reload your env, so you can use node right now

Confira este artigo como sobre como instalar o Node.js sem o sudo .

Para uma solução mais geral sobre este tópico (por exemplo, instalar software localmente), consulte dotsoftware .

Gianluca Casati
fonte
0

basta usar o nvm, você poderá alternar dinamicamente entre diferentes versões de nós e ele será instalado localmente para o usuário. Não é necessário sudo. Apenas verifique se você limpou completamente o nó antigo com antecedência.

https://github.com/nvm-sh/nvm

Marko Nalis
fonte
-2

A melhor solução que encontrei foi instalar o Node.js do pacote tar no diretório inicial do usuário e vincular o local da pasta lib. Aqui está o que você precisa fazer

Isso instalará o Nodejs em ~ / .local / em vez do padrão / usr / local /

Add this to your ~/.npmrc (create the file if it doesn't exist already):

root =    /home/YOUR-USERNAME/.local/lib/node_modules
binroot = /home/YOUR-USERNAME/.local/bin
manroot = /home/YOUR-USERNAME/.local/share/man
Download the Nodejs source code from nodejs.org and install it under your ~/.local tree:

tar xf node......
cd node........
./configure --prefix=~/.local
make
make install

Create ~/.node_modules symlink. (This directory will be automatically searched when you load modules using require "module" in scripts. I'm not sure why Node doesn't search ~/.local/lib/node_modules by default.)

cd
ln -s .local/lib/node_modules .node_modules
Is ~/.local/bin in your path? Type

which npm
If it says ~/.local/bin/npm, you're done.

Otherwise, do this...

export PATH=$HOME/.local/bin:$PATH
...and add that line to your ~/.profile file, so it'll run every time you log in.

Se você ainda encontrar um erro de propriedade ou permissão ao instalar pacotes, altere a propriedade de ~ / .local / dir executando

chown -R user:user ~/.local/

Agora você deve ser bom em instalar pacotes via 'npm'

Nota: TODOS OS COMANDOS ACIMA SÃO DE EXECUÇÃO COMO USUÁRIO. NÃO USE SUDO OU ROOT LOGIN

NUNCA MUDE A PERMISSÃO DE PASTA SOB '/ USR / LIB /'. CONDUZIRÁ AO SO instável

Shank_Transformer
fonte
-2

Acho as explicações de Pawel Grzybek muito convincentes: elas se resumem a três comandos sudo simples, nunca mais sendo necessário usar o sudo novamente para instalações globais do npm:

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
Frank Nocke
fonte