Como você desinstala todas as dependências listadas em package.json (NPM)?

107

Se eu tiver um arquivo package.json definido na raiz do meu aplicativo e executá- npm install -glo, instalarei todas as dependências definidas em package.json, globalmente.

No entanto, isso não parece funcionar ao contrário.

Se eu fizer isso npm uninstall -gna raiz do meu aplicativo, ocorrerá um erro, exigindo que eu lhe passe um nome de pacote.

Isso não deveria desinstalar os mesmos pacotes que instalei?

Estou fazendo algo errado?

qodeninja
fonte
1
FYI meu raciocínio por trás de nunca usar npm -g. peterlyons.com/problog/2012/09/…
Peter Lyons,
1
Lembre-se de que se quiser usar um módulo para o seu projeto, você deve instalá-lo localmente. Instalar um módulo globalmente só fornece mais comandos em seu terminal, como expressjs e express (1) por exemplo.
warchimede
@sgwilly Você está errado sobre ter que usar node_modules globalmente - até diz isso na docuemention - nodejs.org/api/modules.html#modules_all_together - a função require () é 'inteligente' porque parece em vários locais para tentar resolver um caminho para um módulo incluindo o node_modules global
qodeninja
Eu deveria ter sido mais específico: é verdade que require () é inteligente o suficiente para encontrar seu módulo instalado globalmente. Funcionará se todos os seus projetos dependerem da mesma versão desse módulo. No entanto, você pode ter dificuldade em manter projetos que contam com diferentes versões de módulo se você gerenciar dependências apenas globalmente. É por isso que é uma prática recomendada sempre instalar os módulos localmente, e apenas instalá-los globalmente quando quiser obter acesso a alguns comandos executáveis ​​úteis.
warchimede,
@sgwilly - obrigado por compartilhar suas idéias aqui - este projeto em particular é distribuível, então não deve tentar atualizar nada - as atualizações realmente acontecerão por RPM (note RPM não NPM) e os node_modules reais são encolhidos - Eu só precisava de uma maneira de limpar rapidamente o sistema de tudo o que o rpm acabou instalando (no meu ambiente de desenvolvimento)
qodeninja

Respostas:

167

Se estiver usando o Bash, basta alternar para a pasta que contém o arquivo package.json e executar o seguinte:

for package in `ls node_modules`; do npm uninstall $package; done;

No caso de pacotes instalados globalmente, mude para sua %appdata%/npmpasta (se no Windows) e execute o mesmo comando.

EDIT: Este comando quebra com npm 3.3.6 (Node 5.0). Agora estou usando o seguinte comando Bash, que mapeei para npm_uninstall_all em meu arquivo .bashrc:

npm uninstall `ls -1 node_modules | tr '/\n' ' '`

Bônus adicionado? é muito mais rápido!

https://github.com/npm/npm/issues/10187

Jedmao
fonte
1
Você postou exatamente o mesmo comando como uma resposta para "Comando para remover todos os módulos npm globalmente?". Como isso pode ser a coisa apropriada a se fazer tanto naquela situação quanto nesta?
ninguém
@AndrewMedico Por que não é apropriado? Os pacotes instalados no arquivo package.json serão instalados na pasta node_modules. Este comando levará cada subpasta para a pasta node_modules e executará npm uninstall <package>para cada pasta. Eu mesmo fiz isso e funciona perfeitamente!
jedmao
2
@UgoRobain boa pergunta. Acontece que algumas dependências são muito profundas. No sistema de arquivos NTFS (Windows), pelo menos, ele tem problemas para remover diretórios onde o nome do caminho é maior do que algum tipo de limite, deixando esses diretórios fantasmas que você não pode remover. Felizmente, ele npm uninstallcuida disso, por isso esse truque é útil.
jedmao
7
Aqui está o que eu costumava fazer com o PowerShell:foreach($package in ls node_modules){npm uninstall $package}
JustMaier
1
não parece funcionar em janelas. tr is not recognized
Overdrivr
78

Isso funcionou para mim:

prompt de comando ou gitbash na pasta node_modules em seu projeto e execute:

npm uninstall *

Todos os pacotes locais desse projeto foram removidos.

Druubacca
fonte
Isso também não remove as instalações globais?
shinzou
@shinzou Não removeu as instalações globais para mim.
Taylor Edmiston
1
No Mac 10.13.5, isso gera muitos erros conforme abaixo "> [email protected] install / Users / vikramanna / node_modules / heapdump> node-gyp rebuild CXX (destino) Release / obj.target / addon / src / heapdump. o No arquivo incluído de ../src/heapdump.cc:17: ../src/compat-inl.h:300:19: erro: nenhum membro chamado 'GetCpuProfiler' em 'v8 :: Isolate' return isolate-> GetCpuProfiler () -> StartProfiling (title, record_samples); "
vikramvi
35

Para Windows, vá para node_modules dir e execute-o no PowerShell

npm uninstall (Get-ChildItem).Name 
Sameer
fonte
Para mim, isso resulta no erro "A linha de comando é muito longa."
Daniel
29

Recentemente, encontrei um comando de nó que permite desinstalar todas as dependências de desenvolvimento da seguinte maneira:

npm prune --production

Como mencionei, esse comando apenas desinstala os pacotes de dependência de desenvolvimento. Pelo menos me ajudou a não ter que fazer manualmente.

Chalo
fonte
8

Dica para usuários do Windows: execute este comando do PowerShell de dentro do node_modulesdiretório pai:

ls .\node_modules | % {npm uninstall $_}
y0n1
fonte
6
// forcibly remove and reinstall all package dependencies
ren package.json package.json-bak
echo {} > package.json
npm prune
del package.json
ren package.json-bak package.json
npm i

Isso cria essencialmente um package.json falso e vazio, chama npm prunepara remover tudo em node_modules, restaura o package.json original e reinstala tudo.

Algumas das outras soluções podem ser mais elegantes, mas suspeito que seja mais rápido e exaustivo. Em outros threads, vi pessoas sugerirem apenas a exclusão do diretório node_modules, mas pelo menos para o Windows, isso faz com que o npm engasgue depois porque o diretório bin desaparece. Talvez no Linux ele seja restaurado corretamente, mas não no Windows.

meem
fonte
1
No meu caso - eu não precisava do package.json existente (por causa da execução do script no CI depois que os scripts npm foram executados ..) Então, eu apenas usei: "echo {}> package.json & npm prune"
Rikki
5

Na verdade não há opção para fazer isso, se você quiser desinstalar os pacotes de package.jsonsimplesmente faça npm lsno mesmo diretório que package.jsondepende e use npm uninstall <name>ou npm rm <name>para o pacote que deseja remover.

Gntem
fonte
8
Eu sei como removê-los individualmente - faria mais sentido se houvesse um comando para ser executado no arquivo package.json da mesma forma que o npm install funciona.
qodeninja
Não, não queremos desinstalar manualmente cada módulo.
shinzou
1
  1. remova dependências indesejadas de package.json
  2. npm i

" npm i" não só instalará dependências ausentes, como atualizará node_modules para corresponder ao package.json

Misaka_0x447f
fonte
1

( Não replique essas etapas antes de ler tudo )

Para mim, todas as soluções mencionadas não funcionaram. Então eu fui /usr/libe corri lá

for package in `ls node_modules`; do sudo npm uninstall $package; done;

Mas também removeu o npmpacote e apenas metade dos pacotes (até chegar à letra n).

Então, tentei instalar o nó novamente pelo guia de nó.

# Using Ubuntu
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs

Mas não foi instalado npmnovamente.

Então decidi reinstalar o nó inteiro sudo apt-get remove nodejs E instalar novamente pelo guia acima.

Agora o NPM está funcionando novamente, mas os módulos globais ainda estão lá. Então eu verifiquei o conteúdo do diretório /usr/lib/node_modulese parece que o único importante aqui é npm. Então editei o comando acima para desinstalar tudo, excetonpm

for package in $(ls node_modules); do if [ "$package" != "npm" ]; then sudo npm uninstall $package; fi; done;

Ele removeu todos os módulos que não foram prefixados @. Então, eu estendi o loop para subdiretórios.

for package in $(ls node_modules); do if [  ${package:0:1} = \@ ]; then 
        for innerPackage in $(ls node_modules/${package}); do
                sudo npm uninstall "$package/$innerPackage";
        done;
fi; done;

Meu /usr/lib/node_modulesagora contém apenas npmpacotes vinculados.

siOnzee
fonte
0

Mesmo você não precisa executar o loop para isso.

Você pode excluir todos os node_modules usando o único comando: -

npm uninstall `ls -1 node_modules | tr '/\n' ' '`
VIKAS KOHLI
fonte
0

Usuários Powershell: foreach($package in ls node_modules){npm uninstall $package}

Obrigado @JustMailer

Valentine Bondar
fonte
0

Aproveitando de VIKAS KOHLI e jedmao , você pode fazer isso

versão de linha única:

npm uninstall `ls -1 node_modules | grep -v ^@ | tr '/\n' ' '` `find node_modules/@* -type d -depth 1 2>/dev/null | cut -d/ -f2-3 | tr '\n' ' '`

versão multilinha:

npm uninstall \
`ls -1 node_modules | grep -v ^@ | tr '/\n' ' '` \
`find node_modules/@* -type d -depth 1 2>/dev/null | cut -d/ -f2-3 | tr '\n' ' '`
Ryan Lecha
fonte
0

Outra opção SIMPLES é excluir os node_modules e package-lock.json

rm -rf node_modules
rm -rf package-lock.json

Depois disso, você pode tentar reinstalar os pacotes npm

Harsh Phoujdar
fonte