Mudanças incompatíveis planejadas no npm v12
(github.blog)- No npm v12, os padrões relacionados à segurança do
npm installpassarão de execução/interpretação automática para um modelo de permissão explícita, com verificação prévia por meio de avisos disponível no npm 11.16.0 ou superior - O padrão de
allowScriptspassará a ser desativado, bloqueando a execução dos scriptspreinstall,installepostinstallde dependências que não forem explicitamente permitidas, assim como onode-gyp rebuildimplícito e a execução do scriptpreparede dependências git, file e link - Com
npm approve-scripts --allow-scripts-pending, é possível verificar quais pacotes serão bloqueados; depois, usenpm approve-scriptsenpm deny-scriptspara definir o que será permitido ou bloqueado, e faça commit da allowlist gerada nopackage.json - O padrão de
--allow-gitmudará paranone, interrompendo a resolução de dependências Git diretas e transitivas que não forem explicitamente permitidas com--allow-git - Bloqueio do caminho de execução de código em que o
.npmrcde dependências Git podia sobrescrever o executável Git mesmo ao usar--ignore-scripts - O padrão de
--allow-remotemudará paranone, interrompendo a resolução de dependências por URL remota, como tarballs via https, que não forem explicitamente permitidas com--allow-remote - Os padrões de
--allow-filee--allow-directorynão terão mudanças no npm v12 - O procedimento de preparação é atualizar para o npm 11.16.0 ou superior, executar uma instalação normal para revisar os avisos e aprovar apenas os pacotes confiáveis; depois da atualização, apenas os scripts aprovados continuarão sendo executados
- Documentação relacionada:
npm approve-scripts,npm deny-scripts,allow-scriptsconfig
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?