Comando npm para desinstalar ou remover pacotes não utilizados no Node.js
414
Existe uma maneira de simplesmente desinstalar todas as dependências não utilizadas (não declaradas) de um projeto Node.js. (as que não estão mais definidas em minha package.json.)
Não utilizado por quê? Você quer remover pastas de node_modulesquando elas são removidas das respectivas package.json?
Slaks
1
exatamente, mhm npm ll já dá uma boa dica de quais são os candidatos.
Tarion 28/01
Respostas:
670
Nota : As npmversões recentes fazem isso automaticamente quando os bloqueios de pacotes estão ativados; portanto, isso não é necessário, exceto para remover os pacotes de desenvolvimento com o --productionsinalizador.
Execute npm prunepara remover os módulos não listados em package.json.
De npm help prune:
Este comando remove pacotes "estranhos". Se um nome de pacote for fornecido, apenas os pacotes correspondentes a um dos nomes fornecidos serão removidos.
Pacotes estranhos são aqueles que não estão listados na lista de dependências do pacote pai.
Se o --productionsinalizador for especificado, este comando removerá os pacotes especificados em suas devDependencies.
Se eu ler isso corretamente, isso removerá todas as subdependências, pois elas não estão listadas package.json. Isso está certo? Portanto, a próxima atualização ou instalação teria que reinstalá-los.
Nshew 18/04
1
Sim, ele removerá as subdependências. As subdependências são realmente armazenadas dentro do próprio node_modulesdiretório do módulo e , portanto, são removidas com o módulo.
Darkhogg
2
Deixe-me dar um exemplo. Retiro o karma do meu package.json, mas deixo o caramanchão. Quando corro npm prune, espero que todo o karma, incluindo sua própria node_modulespasta contendo suas dependências, seja removido. E as dependências do bower (bower-json, bower-logger, chmodr, fstream, glob, et al.). Tecnicamente, esses não estão listados no meu projeto package.json. Os que foram removidos ou não?
Nshew
3
Não, eles não são. Observe que eles não estão por sua conta node_modules, mas por dentronode_modules/bower/node_modules , "protegidos" por node_modules/bower/package.json. As dependências do seu pacote e as dependências do seu pacote não são misturadas .
Darkhogg
2
e exclua o seu shrinkwrap antes da instalação do npm, deveria estar nas instruções acima.
Andy Ray
306
Se você não estiver preocupado com alguns minutos, uma solução seria rm -rf node_modules e npm installnovamente para reconstruir os módulos locais.
Seria bom se as pessoas parassem de votar isso sem comentar. É uma estratégia válida para redefinir as dependências de um projeto de nó como uma alternativa à resposta aceita. Se você danificou o conteúdo do subdiretório node_modules (fácil de fazer com dependências vinculadas pelo sym) ou se você teve alterações adicionais, como a remoção de bumps da versão do nó ou do npm, não limpará adequadamente a pasta node_modules, mas esta resposta será.
Pyrce
41
A reconstrução node_modulestambém verifica se o package.jsonarquivo descreve um gráfico de dependência reproduzível. Remover e reinstalar o seu node_modulesé basicamente um teste de implantação.
Joemaller
2
@joemaller Não necessariamente, a maioria dos fluxos de trabalho de implantação possui, implícita ou explicitamente, algum tipo de cache. Se um pacote já estiver instalado e atender às especificações, ele será mantido. A remoção e a reinstalação farão com que os pacotes colidam com a versão mais recente correspondente.
93016 Darkhogg
7
npm prunenão ajudou nem um pouco, mas isso ajudou. Meu problema foi um link simbólico quebrado.
Eirik Birkeland
8
Sob muitas circunstâncias não ideais, atualmente é inviável com a NPM. Além disso, a pergunta definitivamente não especificou algumas restrições ao trabalho repetido ou à busca adicional, apenas como atingir o objetivo final. Esta resposta satisfaz a pergunta como afirmado, apesar do que os outros possam querer além desse objetivo.
Pyrce
10
Você pode usar o npm-prune para remover pacotes estranhos.
Este comando remove pacotes "estranhos". Se um nome de pacote for fornecido, apenas os pacotes correspondentes a um dos nomes fornecidos serão removidos.
Pacotes estranhos são aqueles que não estão listados na lista de dependências do pacote pai.
Se o --production sinalizador for especificado ou o NODE_ENV variável de ambiente é definida como a produção , este comando irá remover os pacotes especificados em suas devDependencies . A configuração --no-production negará que NODE_ENV seja definido como produção .
Se o sinalizador --dry-run for usado, nenhuma alteração será efetivamente feita.
Se o sinalizador --json for usado, as alterações que o npm remove (ou teria feito com --dry-run ) serão impressas como um objeto JSON.
Em operação normal com os bloqueios de pacotes ativados, os módulos externos são removidos automaticamente quando os módulos são instalados e você só precisará deste comando com o sinalizador --production .
Se você desabilitou os bloqueios de pacotes, os módulos externos não serão removidos e cabe a você executar a remoção do npm de tempos em tempos para removê-los.
Use npm-dedupe para reduzir a duplicação
npm dedupe
npm ddp
Pesquisa a árvore de pacotes local e tenta simplificar a estrutura geral movendo as dependências para mais adiante na árvore, onde elas podem ser compartilhadas com mais eficácia por vários pacotes dependentes.
Por exemplo, considere este gráfico de dependência:
a
+-- b <-- depends on c@1.0.x|`-- c@1.0.3`-- d <-- depends on c@~1.0.9`-- c@1.0.10
Nesse caso, o npm-dedupe transformará a árvore em:
a
+-- b
+-- d
`-- c@1.0.10
Devido à natureza hierárquica da pesquisa do módulo do nó, tanto b quanto d terão sua dependência atendida pelo único pacote c no nível raiz da árvore.
O algoritmo de deduplicação percorre a árvore, movendo cada dependência o mais alto possível na árvore, mesmo que duplicatas não sejam encontradas. Isso resultará em uma árvore plana e desduplicada.
node_modules
quando elas são removidas das respectivaspackage.json
?Respostas:
Nota : As
npm
versões recentes fazem isso automaticamente quando os bloqueios de pacotes estão ativados; portanto, isso não é necessário, exceto para remover os pacotes de desenvolvimento com o--production
sinalizador.Execute
npm prune
para remover os módulos não listados empackage.json
.De
npm help prune
:fonte
package.json
. Isso está certo? Portanto, a próxima atualização ou instalação teria que reinstalá-los.node_modules
diretório do módulo e , portanto, são removidas com o módulo.package.json
, mas deixo o caramanchão. Quando corronpm prune
, espero que todo o karma, incluindo sua próprianode_modules
pasta contendo suas dependências, seja removido. E as dependências do bower (bower-json, bower-logger, chmodr, fstream, glob, et al.). Tecnicamente, esses não estão listados no meu projetopackage.json
. Os que foram removidos ou não?node_modules
, mas por dentronode_modules/bower/node_modules
, "protegidos" pornode_modules/bower/package.json
. As dependências do seu pacote e as dependências do seu pacote não são misturadas .Se você não estiver preocupado com alguns minutos, uma solução seria
rm -rf node_modules
enpm install
novamente para reconstruir os módulos locais.fonte
node_modules
também verifica se opackage.json
arquivo descreve um gráfico de dependência reproduzível. Remover e reinstalar o seunode_modules
é basicamente um teste de implantação.npm prune
não ajudou nem um pouco, mas isso ajudou. Meu problema foi um link simbólico quebrado.Você pode usar o npm-prune para remover pacotes estranhos.
Este comando remove pacotes "estranhos". Se um nome de pacote for fornecido, apenas os pacotes correspondentes a um dos nomes fornecidos serão removidos.
Pacotes estranhos são aqueles que não estão listados na lista de dependências do pacote pai.
Se o --production sinalizador for especificado ou o NODE_ENV variável de ambiente é definida como a produção , este comando irá remover os pacotes especificados em suas devDependencies . A configuração --no-production negará que NODE_ENV seja definido como produção .
Se o sinalizador --dry-run for usado, nenhuma alteração será efetivamente feita.
Se o sinalizador --json for usado, as alterações que o npm remove (ou teria feito com --dry-run ) serão impressas como um objeto JSON.
Em operação normal com os bloqueios de pacotes ativados, os módulos externos são removidos automaticamente quando os módulos são instalados e você só precisará deste comando com o sinalizador --production .
Se você desabilitou os bloqueios de pacotes, os módulos externos não serão removidos e cabe a você executar a remoção do npm de tempos em tempos para removê-los.
Use npm-dedupe para reduzir a duplicação
Pesquisa a árvore de pacotes local e tenta simplificar a estrutura geral movendo as dependências para mais adiante na árvore, onde elas podem ser compartilhadas com mais eficácia por vários pacotes dependentes.
Por exemplo, considere este gráfico de dependência:
Nesse caso, o npm-dedupe transformará a árvore em:
Devido à natureza hierárquica da pesquisa do módulo do nó, tanto b quanto d terão sua dependência atendida pelo único pacote c no nível raiz da árvore.
O algoritmo de deduplicação percorre a árvore, movendo cada dependência o mais alto possível na árvore, mesmo que duplicatas não sejam encontradas. Isso resultará em uma árvore plana e desduplicada.
fonte