如何卸载package.json(NPM)中列出的所有依赖项?


107

如果我在应用程序根目录中定义了package.json文件并运行npm install -g,它将安装在package.json中定义的所有依赖项。

但是,这似乎并非相反。

如果我npm uninstall -g在应用程序根目录中执行此操作,则会引发错误,使我无法通过它传递程序包名称。

这还不应该卸载与我安装的相同的软件包吗?

难道我做错了什么?


1
仅供参考,我不使用npm -g的理由。peterlyons.com/problog/2012/09/...
彼得·莱昂斯

1
请记住,如果要为项目使用模块,则必须在本地安装它。全局安装模块只能在您的终端中提供更多命令,例如expressjs和express(1)。
warchimede

@sgwilly您必须在全局使用node_modules是错误的-甚至在文档中也是如此-nodejs.org/api/modules.html#modules_all_together-require()函数在各个位置看起来都很“智能”尝试解决包含全局node_modules的模块的路径
qodeninja 2013年

我本来应该更具体一点:require()确实足够聪明,可以找到您全局安装的模块。如果您所有的项目都依赖于该模块的相同版本,那么它将起作用。但是,如果仅全局管理依赖项,则可能很难维护依赖于不同模块版本的项目。这就是为什么最佳实践是始终在本地安装模块,并且仅当您想访问一些方便的可执行命令时才在全局安装它们。
2013年

@sgwilly-感谢您在这里分享您的想法-特别是该项目是可分发的,因此它不应该尝试更新任何内容-实际的更新将通过RPM进行(请注意,RPM不是NPM),并且实际的node_modules被收缩包装-我只需要一种方法来快速清理最终安装的rpm(在我的开发环境中)的系统
qodeninja 2013年

Answers:


168

如果使用Bash,只需切换到包含package.json文件的文件夹,然后运行以下命令:

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

对于全局安装的软件包,请切换到您的%appdata%/npm文件夹(如果在Windows上)并运行相同的命令。

编辑:此命令中断与npm 3.3.6(节点5.0)。我现在使用以下Bash命令,该命令已映射到我的.bashrc文件中的npm_uninstall_all:

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

增加奖金了吗?它更快!

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


1
您发布了与“是否要全局删除所有npm模块的命令?”答案完全相同的命令。在这种情况下和在这种情况下,如何做适当的事情?
没人

@AndrewMedico不合适吗?package.json文件中安装的软件包将安装在node_modules文件夹中。此命令会将每个子文件夹带到node_modules文件夹并npm uninstall <package>针对每个文件夹运行。我自己做的,效果很好!
jedmao

2
@UgoRobain好问题。事实证明,某些依赖关系确实很深。至少在NTFS文件系统(Windows)上,它无法删除路径名称长于某种限制的目录,而无法删除这些幻像目录。幸运的是,请您npm uninstall多多关照,这就是为什么此技巧很有用的原因。
jedmao 2014年

7
这是我过去使用powershell进行的操作:foreach($package in ls node_modules){npm uninstall $package}
JustMaier 2015年

1
在Windows上似乎不起作用。tr is not recognized
Overdrivr

78

这对我有用:

命令提示符或gitbash到项目中的node_modules文件夹中,然后执行:

npm uninstall *

删除了该项目的所有本地软件包。


这也不会删除全局安装吗?
shinzou '18

@shinzou它没有为我删除全局安装。
泰勒·埃德米斯顿

1
在Mac 10.13.5上,这将引发很多错误,如下所示“> heapdump@0.3.9 install / Users / vikramanna / node_modules / heapdump> node-gyp重建CXX(target)Release / obj.target / addon / src / heapdump。 o在../src/heapdump.cc:17中包含的文件中:../src/compat-inl.h:300:19:错误:'v8 :: Isolate'中没有名为'GetCpuProfiler'的成员返回isolate-> GetCpuProfiler()-> StartProfiling(title,record_samples);“
vikramvi '18 -10-29

35

对于Windows,请转到node_modules目录,然后在powershell中运行它

npm uninstall (Get-ChildItem).Name 

对我来说,这将导致错误“命令行太长”。
丹尼尔(Daniel)

29

我最近找到了一个节点命令,该命令允许按如下所示卸载所有开发依赖项:

npm prune --production

如前所述,该命令仅卸载开发依赖包。至少它帮助我不必手动进行操作。


8

Windows用户的提示:从node_modules父目录中运行以下PowerShell命令:

ls .\node_modules | % {npm uninstall $_}

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

这实际上会创建一个伪造的空package.json,调用npm prune以删除node_modules中的所有内容,还原原始package.json并重新安装所有内容。

其他一些解决方案可能更优雅,但是我怀疑这是更快且详尽的方法。在其他线程上,我看到有人建议只删除node_modules目录,但是至少对于Windows而言,这会导致npm随后阻塞,因为bin目录丢失了。也许在Linux上,它可以正确还原,但Windows不能。


1
在我的情况-我并不需要对现有的package.json(因为故宫脚本被执行后CI运行脚本的。)所以,我只是去:“回声{}>的package.json&故宫修剪”
RIKKI

5

实际上,如果要从package.jsonnpm lspackage.json依赖和使用同一目录的目录中卸载软件包npm uninstall <name>npm rm <name>要删除的软件包,则没有任何选择。


8
我知道如何单独删除它们-如果有一个命令可以像对npm install一样对package.json文件运行,那将更有意义。
qodeninja

不,我们不想手动卸载每个模块。
shinzou '18

1
  1. package.json删除不需要的依赖项
  2. npm i

npm i”不仅会安装缺少的deps,还会更新node_modules以匹配package.json


1

在阅读完所有内容之前,请不要重复这些步骤

对我来说,所有提到的解决方案都行不通。我去/usr/lib那里跑了

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

但是它也删除了npm包装,只移除了一半包装(直到达到字母n)。

因此,我尝试通过节点指南再次安装节点。

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

但它没有npm再次安装。

因此,我决定重新安装整个节点 sudo apt-get remove nodejs ,然后按照上面的指南再次安装。

现在NPM再次正常工作,但是全局模块仍然存在。所以我检查了目录的内容,/usr/lib/node_modules看来这里唯一重要的是npm。所以我编辑了上面的命令以卸载除npm

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

它删除了所有未加前缀的模块@。如此,我扩展了子目录的循环。

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;

我的/usr/lib/node_modules现在仅包含npm和链接的软件包。


0

即使您不需要为此运行循环。

您可以使用唯一的一条命令删除所有的node_modules:

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

0

Powershell用户: foreach($package in ls node_modules){npm uninstall $package}

谢谢@JustMailer


0

的捎带关闭VIKAS KOHLIjedmao,你可以这样做

单行版本:

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' ' '`

多行版本:

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' ' '`

0

另一个简单的选项是删除node_modules和package-lock.json

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

之后,您可以尝试重新安装npm软件包

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.