npm v12 anuncia mudanças que quebram compatibilidade
(github.blog)- O comportamento padrão de
npm installvai mudar para um modelo focado em segurança, em que recursos antes executados automaticamente passarão a funcionar apenas com permissão explícita do usuário (opt-in) allowScriptsdesativado por padrão — scriptspreinstall,installepostinstallpresentes em pacotes externos instalados serão bloqueados por padrão, e só serão executados para pacotes permitidos pelo projeto- A mudança bloqueia scripts que antes rodavam automaticamente só por instalar um pacote, reduzindo a chance de código malicioso se infiltrar
- Builds nativos com
node-gyptambém entram no bloqueio, então até pacotes que só têmbinding.gype nenhum script de instalação separado deixarão de ser compilados (porque o npm executa internamentenode-gyp rebuild) - O script
preparede pacotes obtidos via git, file ou link também será bloqueado da mesma forma - Uso: verifique quais pacotes têm scripts com
npm approve-scripts --allow-scripts-pending→ permita apenas os confiáveis comnpm approve-scriptse bloqueie o restante comnpm deny-scripts→ como a lista de permissões é salva nopackage.json, faça commit dela
--allow-gitcom valor padrãonone— pacotes obtidos diretamente de repositórios Git (incluindo os que eles próprios puxam) serão bloqueados por padrão, e a instalação só acontecerá se forem permitidos com--allow-git- Isso bloqueia o caminho pelo qual o
.npmrcdentro de um pacote Git podia substituir o próprio executável do Git (--ignore-scriptstambém não impedia esse problema) (npm 11.10.0+)
- Isso bloqueia o caminho pelo qual o
--allow-remotecom valor padrãonone— pacotes obtidos por URL remota, como tarballs via https (incluindo dependências transitivas), serão bloqueados por padrão, e só poderão ser instalados se forem permitidos com--allow-remote(npm 11.15.0+)- Já
--allow-filee--allow-directorynão terão seus valores padrão alterados nesta v12
- Já
- Todas essas mudanças serão oferecidas primeiro como avisos no npm 11.16.0 ou superior, permitindo verificar e se preparar antes do lançamento oficial
- A previsão de lançamento da v12 é julho de 2026
1 comentários
Comentários do Hacker News
Não sei como deixei passar que o npm foi adquirido pelo GitHub, mas de repente muita coisa começou a fazer sentido
É difícil pensar em um lugar pior para abrigar uma parte tão importante do ecossistema Node
https://github.blog/news-insights/company-news/npm-is-joinin...
É “abraçar, estender e extinguir”
https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguis...
Scripts de postinstall já deveriam ter sido removidos há muito tempo e são um câncer nos pacotes NPM
Tem postinstalls profundamente aninhados e sem controle demais sendo executados aleatoriamente quando você baixa alguma coisa
Não sei quem em algum momento achou que isso era uma boa ideia
Normalmente você vai acabar executando o código de dependência empacotado de qualquer forma em algum momento, e em geral com os mesmos privilégios do processo de instalação
Então esses scripts de configuração, sejam bons ou ruins, podem simplesmente mover seu ponto de entrada do npm para onde acontece o
importourequireA menos que todo o ecossistema migre para um ambiente sandboxed como o Deno, isso parece no máximo um pequeno obstáculo. Embora esse possa ser o plano
Um exemplo que me vem à cabeça imediatamente é https://www.npmjs.com/package/patch-package
Espero que a histeria atual não leve a decisões inúteis desse tipo
Isso provavelmente foi discutido centenas de vezes dentro do NPM desde que veio a público 10 anos atrás
Por causa de Shai Halud, agora ficou grande demais para ignorar
“A gente corrige depois” quase sempre vira “droga, agora a gente tem que corrigir”
Fico curioso se as versões LTS atuais do Node, se bem me lembro 22, 24, 26, vão atualizar o npm empacotado para o v12 para receber esse ajuste de segurança
No momento todas incluem o npm v11
O npm foi de 9 para 10 no v18.19.0[1] e no v20.10.0[2]
[1]: https://nodejs.org/en/blog/release/v18.19.0#npm-updated-to-v...
[2]: https://nodejs.org/en/blog/release/v20.10.0
Como o texto diz, basta configurar os padrões adequados
A melhor parte dessa mudança é que, com o padrão alterado, pacotes irritantes que assumem que essas configurações estarão ativas quando novos desenvolvedores simplesmente rodarem install vão quebrar imediatamente
Isso pode fazer com que parem com a prática de presumir que scripts podem ser executados
Pelo texto não fica claro, mas parece que a lista de permissões de scripts oferece suporte a permissão por pacote, e não só uma configuração global
Deve ficar mais fácil manter políticas organizacionais que permitam scripts só para pacotes específicos
Fico pensando se existe algum linter que possa ser usado para bloquear padrões inseguros nas configurações do gerenciador de pacotes desse jeito
grepnão resolve?Fico me perguntando se ainda existe algum motivo para usar Yarn
Não sei se o Yarn também implementou proteções para impedir ataques à cadeia de suprimentos
Até agora eu só conhecia o pnpm, então é bom ver o npm correndo atrás
A release 4.x mais recente do Yarn garante um comportamento determinístico quase ao ponto do exagero, e você pode esperar um comportamento consistente em toda a equipe
Em termos de recursos, há muitos pequenos detalhes que, quando você se acostuma, acabam fazendo bastante diferença
A próxima major também deve continuar nessa mesma direção, com desempenho melhor e recursos que até agora não dava para implementar sem depender desses ganhos de performance
Para referência, sou o maintainer principal do Yarn
Também tem recursos de proteção da cadeia de suprimentos
No fim não aguentei e migrei para pnpm, e as instalações ficaram muito mais rápidas tanto no CI quanto nas máquinas locais de desenvolvimento
Levei cerca de um dia para fazer a migração com ajuda de um LLM
node_modules, mas executados diretamente de arquivos compactadoshttps://yarnpkg.com/features/pnp
É bem parecido com usar
.jarem Java em vez de uma árvore de diretórios com arquivos.classMas é um pouco gambiarra, e o suporte de editores e ferramentas varia bastante
Como há muito menos arquivos pequenos, pode ser especialmente mais rápido se você for obrigado a trabalhar no Windows
Também dá para colocar os arquivos no repositório git, eliminando a dependência de internet e de registros de pacotes
Eu realmente não sei a resposta
Eu não sabia que o npm era do GitHub
Isso explica várias coisas
Algumas partes ficam interessantes de reler com o passar do tempo
O comentário mais votado dizia algo como: “A Microsoft não acerta tudo, mas a aquisição do GitHub honestamente foi muito melhor do que eu esperava. Em vez de forçar políticas centradas na Microsoft no GitHub, a Microsoft acabou adotando mais coisas do GitHub na perspectiva de produto. O GitHub ainda opera como se fosse uma empresa separada”
Tinha recebido investimento de venture capital, mas não conseguiu encontrar um modelo de negócios sustentável
O GitHub a adquiriu para salvar o ecossistema, e essa aquisição também quase não trouxe grande benefício para o GitHub
E a Microsoft moveu o GitHub para o Azure
Fico curioso se a lista de permissões no
package.jsonfixa também a versão do pacote, ou se fixa só o nome do pacoteBom ver que o padrão de
allowScriptsfica desativado[olha para o relógio] Só uns 18 meses atrás do pnpm, então?
Para que isso serve no mundo JavaScript?