Atualmente estou aprendendo Angular e npm. Hoje tentei fazer npm i -g @angular/cli
no meu Fedora, mas ao invés de instalá-lo, vi no terminal (encurtei a mensagem por conveniência):
npm WARN checkPermissions Missing write access to /usr/lib/node_modules
Então, verifiquei no Google o que isso significa. eu encontreiesta explicação npm, e este artigo me levou aoutro artigo npmdescrevendo esse erro com mais detalhes. Este último artigo afirmava que:
Se você vir um erro EACCES ao tentar instalar um pacote globalmente, você pode:
Reinstale o npm com um gerenciador de versão de nó (recomendado),
ou
Altere manualmente o diretório padrão do npm
Como solução rápida, ambas as soluções acima pareciam OK.
Mas como tenho alguma experiência com Linux, comecei a me perguntar: por que tenho que instalar outro software, ou por que tenho que alterar alguma configuração? Falando de outra forma, por que a configuração padrão do npm e a configuração padrão do Fedora exigem que eu ajuste pelo menos uma delas para não haver erros?
Depois de me fazer essas perguntas, pensei que o caso poderia estar na minha configuração npm. Provavelmente não mudei nada desde a instalação, mas quem sabe? Então, decidi reinstalar o npm. Para ter certeza, reiniciei o computador após a desinstalação. Após reinstalar, tentei npm i -g @angular/cli
novamente – mas ocorreu o mesmo erro.
Aí pensei: talvez não seja o caso do npm, talvez seja o caso da minha instalação do Fedora? Eu certamente não queria reinstalar o Fedora por esse motivo. Então, verifiquei no Google se as permissões padrão do Fedora para o diretório /usr/lib/node_modules
são as mesmas por padrão. Para meu diretório, para ambos /usr
e /usr/lib
( /usr/lib/node_modules
e até mesmo para /usr/lib/node_modules/npm
) o proprietário e o grupo eram root root
e somente o proprietário tinha permissões de gravação. A única fonte que encontrei foi o "Guia de Instalação do Fedora 26" (embora eu tenha o Fedora 29 instalado), e esse documento me aconselhava a revisar oPadrão de hierarquia do sistema de arquivos 2.3para a estrutura de diretórios. Como eu esperava node_modules
ter atribuído exatamente as permissões que o npm deseja, verifiquei apenas /usr
e /usr/lib
. Para o /usr
diretório, a ESF não pareceu informar nada sobre permissões; para o /usr/lib
diretório, afirmou que:
/usr/lib inclui arquivos-objeto, bibliotecas e binários internos que não se destinam a serem executados diretamente por usuários ou scripts de shell. [22]
Esta informação também não foi muito útil.
Por fim, cheguei à conclusão de que ainda não entendo qual é a verdadeira causa do erro que recebi. Então agora eu gostaria de perguntar:
- Será que o npm deve ser configurado por padrão da mesma forma que deve colocar os novos pacotes
/usr/lib/node_modules
? - Se sim, será que o Fedora definiu algumas outras permissões padrão que deveria/deve/pode ter para esses diretórios?
- Se não, será que eu alterei acidentalmente as permissões da instalação do Fedora para esses diretórios?
- Se não, é o caso de eu não instalar pacotes npm com permissões de root? Isso também parece ser uma solução, mas a documentação do npm não menciona tal solução.
- Se não, é o caso de eu tentar instalar pacotes npm globalmente, mas não deveria? Se sim, por que existe tal possibilidade?
- Há algo que eu não entendo ou estou perdendo? Talvez me falte alguma documentação (atualizada)?
ATUALIZAR:Esqueci de ressaltar que executo todos os comandos como usuário normal, não como root.
Responder1
Você não disse com qual usuário executou isso, mas presumo que não era root? Nesse caso, o erro está correto, mas também é esperado porque os usuários normais não deveriam conseguir instalar nos diretórios do sistema.
De qualquer forma, você nunca deve usar npm
para instalar pacotes globalmente com o Node.js empacotado pelo Fedora, apenas porque isso o deixará com uma confusão confusa de módulos gerenciados por rpm e gerenciados por npm no /usr/lib/node_modules
.
Infelizmente, ao contrário de outros ambientes de linguagem, o Node.js não suporta dois diretórios de módulos globais separados (um /usr
para módulos gerenciados pelo pacote do sistema e outro /usr/local
para módulos gerenciados pelas próprias ferramentas do ambiente de linguagem), portanto, não podemos fazer isso funcionar em de uma maneira sensata, sem patches extensos do npm que não desejamos fazer. Mesmo que tal divisão fosse possível, você ainda precisaria ser root para fazer uma instalação global, assim como faz com perl, python ou ruby.
Pelo que entendi, a instalação global é desencorajada pelo Node.js de qualquer maneira - a visão do upstream é que você deve instalar localmente em cada projeto apenas os módulos que o projeto precisa.