Como Corrigir EACCES: Permission Denied no npm
Você executa npm install -g para instalar uma ferramenta de CLI e, em vez de uma instalação limpa, recebe isto:
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
Este erro EACCES do npm é um dos erros de permissão mais comuns do Node.js que os desenvolvedores enfrentam no macOS e no Linux. Veja por que ele acontece e como corrigi-lo da forma adequada.
Principais Conclusões
- O erro EACCES ocorre porque o npm tenta escrever em um diretório de propriedade do root, como
/usr/local/lib/node_modules, ao qual sua conta de usuário não tem acesso. - A solução recomendada é instalar o Node.js através de um gerenciador de versões como o nvm, que coloca tudo dentro do seu diretório home.
- Alternativamente, você pode configurar o npm para usar um diretório global de propriedade do usuário, alterando seu prefixo e atualizando seu PATH.
- Evite
sudo npm install -g— isso causa problemas de permissão a longo prazo e introduz riscos de segurança. - Para uso pontual de CLI, o
npxexecuta pacotes sem exigir uma instalação global.
Por Que Ocorrem Erros de Permissão Denied no npm
Quando você executa npm install -g, o npm escreve em um diretório de nível de sistema como /usr/local/lib/node_modules. Se você instalou o Node.js usando um instalador oficial ou um gerenciador de pacotes do sistema, esse diretório normalmente pertence ao root. Sua conta de usuário comum não tem acesso de escrita a ele, então a instalação falha.
Isso é um recurso de segurança dos sistemas baseados em Unix, não um bug. A correção não é sobrepor essas proteções — é dar ao npm um local que seu usuário já possua.
Distinção importante: Este artigo cobre erros de permissão em instalações globais. Se você está vendo erros de permissão dentro da pasta
node_modulesde um projeto local, a causa é diferente — geralmente uma incompatibilidade de propriedade de arquivos no diretório do seu projeto.
Corrigir Permissões de Instalação Global do npm: Duas Abordagens Seguras
Opção 1: Reinstalar o Node.js Usando um Gerenciador de Versões (Recomendado)
O npm recomenda oficialmente o uso de um gerenciador de versões do Node como o nvm para evitar completamente os erros EACCES. Quando o nvm instala o Node, ele coloca tudo dentro do seu diretório home — um local que seu usuário possui por padrão. Sem necessidade de acesso root, nunca.
Instale o nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh | bash
Em seguida, instale o Node:
nvm install --lts
Depois disso, npm install -g funciona sem sudo ou alterações de permissão. Como bônus, o nvm permite alternar entre versões do Node por projeto — algo que nenhuma outra solução oferece.
Nota: Se você já tem um prefixo personalizado do npm configurado, o nvm gerencia seu próprio prefixo internamente. Não combine ambas as abordagens no mesmo ambiente, pois elas podem entrar em conflito.
Opção 2: Configurar um Diretório Global do npm de Propriedade do Usuário
Se você preferir não usar o nvm, pode redirecionar o local de instalação global do npm para um diretório que seu usuário possua. Esta é a alternativa descrita na documentação oficial do npm.
mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
Em seguida, adicione o diretório bin ao seu PATH. Para bash, adicione isto ao ~/.profile ou ~/.bashrc:
export PATH=~/.npm-global/bin:$PATH
Para zsh, adicione a mesma linha ao ~/.zshrc e recarregue:
source ~/.zshrc
Verifique se funciona instalando um pacote sem sudo:
npm install -g npm-check-updates
Discover how at OpenReplay.com.
E Sobre sudo npm install -g?
Evite. Executar sudo com o npm instala arquivos pertencentes ao root, o que cria mais problemas de permissão no futuro e introduz riscos reais de segurança — um pacote malicioso ou comprometido é executado com privilégios elevados. É uma solução de curto prazo que piora as coisas.
Uma Alternativa Rápida: Use npx
Se você só precisa de uma ferramenta de CLI ocasionalmente, talvez não precise de uma instalação global. O npx executa pacotes sem instalá-los globalmente, usando um pacote local ou buscando um temporariamente:
npm create vite@latest
Sem permissões necessárias, sem diretório global envolvido.
Qual Solução Você Deve Usar?
| Situação | Melhor Abordagem |
|---|---|
| Desenvolvedor gerenciando múltiplos projetos | nvm |
| Máquina única, sem necessidade de trocar versões | Prefixo npm personalizado |
| Uso pontual de ferramenta CLI | npx |
Conclusão
A causa raiz dos erros EACCES no npm install -g é quase sempre a mesma: o npm está tentando escrever em um diretório de propriedade do root. Corrija essa incompatibilidade na origem — seja usando o nvm ou apontando o npm para um diretório que você possua — e o erro desaparece para sempre.
Perguntas Frequentes
Você pode, mas não deveria. Usar sudo instala pacotes pertencentes ao root, o que leva a mais problemas de permissão quando o npm posteriormente tenta atualizá-los ou removê-los como seu usuário comum. Também expõe seu sistema a riscos de segurança, já que qualquer script de instalação é executado com privilégios elevados. Use o nvm ou um prefixo personalizado.
Instalações globais escrevem em diretórios do sistema como /usr/local/lib/node_modules, que pertencem ao root na maioria dos sistemas. Instalações locais escrevem em uma pasta node_modules dentro do diretório do seu projeto, que você já possui. É por isso que npm install funciona bem localmente, mas falha globalmente sem a configuração adequada.
Sim, os pacotes previamente instalados sob o antigo prefixo não estarão disponíveis no novo. Você precisará reinstalá-los no novo local. Liste seus globais antigos com npm list -g --depth=0 antes de alterar o prefixo e, em seguida, reinstale-os após o novo diretório estar configurado e seu PATH atualizado.
Geralmente não. O Windows usa um modelo de permissão diferente, e o caminho padrão de instalação global do npm no Windows já está dentro da pasta AppData do usuário. Os erros EACCES são quase exclusivos do macOS e Linux, onde a propriedade de arquivos no estilo Unix controla o acesso de escrita a diretórios do sistema como /usr/local.
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.