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

142
如果我在应用程序根目录中定义了一个 package.json 文件,并运行 npm install -g,它将全局安装 package.json 中定义的所有依赖项。
然而,这似乎在反向操作时不起作用。
如果我在应用程序根目录中执行 npm uninstall -g,它会抛出一个错误,要求我传递一个包名称。
这不应该卸载我安装的相同的包吗?
我做错了什么吗?

1
关于为什么从不使用npm -g的我的思考。http://peterlyons.com/problog/2012/09/managing-per-project-interpreters-and-the-path - Peter Lyons
1
请记住,如果您想在项目中使用一个模块,您必须在本地安装它。全局安装模块只会在终端中提供更多的命令,例如expressjs和express(1)。 - warchimede
@sgwilly,你关于必须全局使用node_modules是错误的——文档中甚至有说明——http://nodejs.org/api/modules.html#modules_all_together——require()函数很“聪明”,它会在各种位置查找以尝试解析模块的路径,包括全局node_modules。 - qodeninja
我应该更加具体:确实,require()足够聪明,可以找到全局安装的模块。如果所有项目都依赖于该模块的相同版本,则它将起作用。然而,如果您仅全局管理依赖项,则可能难以维护依赖于不同模块版本的项目。这就是为什么最佳实践始终在本地安装模块,并仅在需要访问某些方便的可执行命令时才全局安装它们的原因。 - warchimede
@sgwilly - 感谢您在这里分享您的想法--特别是这个项目是可分发的,因此它不应该尝试更新任何内容--实际上的更新将通过RPM进行(请注意,不是NPM),而实际的node_modules已经被缩小了--我只需要一种快速清理系统中rpm安装的任何内容的方法(在我的开发环境中)。 - qodeninja
16个回答

196

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

for package in `ls node_modules`; do npm uninstall $package; done;
在全局安装的软件包的情况下,如果您使用的是Windows系统,请切换到%appdata%/npm文件夹并运行相同的命令。

编辑:此命令无法在npm 3.3.6(Node 5.0)中正常工作。现在我正在使用以下Bash命令,并将其映射到我的.bashrc文件中的npm_uninstall_all:

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

额外的好处?它要快得多!

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


2
你在“如何在全局删除所有npm模块的命令”中回答了相同的命令,这怎么可能是两种情况下都适当的做法呢? - nobody
为什么不直接删除 node_modules 文件夹呢? - Ugo Robain
2
@UgoRobain 很好的问题。事实证明,有些依赖关系非常深入。在NTFS文件系统(Windows)上,至少存在无法删除路径名超过某种限制的目录的问题,留下了这些你无法删除的幽灵目录。幸运的是,npm uninstall会处理这个问题,这就是为什么这个技巧很有用的原因。 - jedmao
8
这是我以前用PowerShell执行的命令:foreach($package in ls node_modules){npm uninstall $package} - JustMaier
1
似乎在Windows上无法工作。tr未被识别。 - Overdrivr
显示剩余6条评论

109

这个方法适用于我:

在你的项目中进入 node_modules 文件夹,然后执行命令提示符或 Git Bash:

npm uninstall *

移除了该项目的所有本地包。


这会连同全局安装一起删除吗? - shinzou
2
@shinzou 它没有为我删除全局安装。 - Taylor D. Edmiston
2
在Mac 10.13.5上,以下错误会被抛出:"> heapdump@0.3.9 install /Users/vikramanna/node_modules/heapdump
node-gyp rebuild
CXX(target) Release/obj.target/addon/src/heapdump.o 在../src/heapdump.cc中包含的文件: ../src/compat-inl.h:300:19: error: no member named 'GetCpuProfiler' in 'v8::Isolate' return isolate->GetCpuProfiler()->StartProfiling(title, record_samples);"
- vikramvi

40

最近我发现了一个Node命令,可以卸载所有开发依赖项,如下:

npm prune --production

如我所提到的,此命令仅卸载开发依赖包。至少它帮助我避免手动执行。


1
这绝对不可能是“删除所有模块”的命令。该命令删除未使用的开发依赖项,这些依赖项不需要用于生产环境(--production)。如果它没有在您的 package.json 文件的“dependencies”或“optionalDependencies”部分中显式列出,它将被删除。 - E10

39

对于 Windows 系统,请前往 node_modules 目录并在 PowerShell 中运行以下命令:

npm uninstall (Get-ChildItem).Name 

3
对我来说,这导致了错误提示:“命令行太长了”。 - Daniel

10

对于Windows用户的提示:在 node_modules 父目录中运行此PowerShell命令:

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

10

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

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

这样之后,您可以尝试重新安装npm包。


2
谢谢这个建议。我没有全局包。大多数回复都在谈论-g选项!我花了很长时间才摆脱所有本地包,因为我对nodejs / npm的了解不足,我从几个不同的目录中执行了“npm install this-and-that”。当我使用“npm uninstall <anything>”时,“npm ls”仍然显示一些包。我是shell程序员,所以尝试在“npm ls”输出的每个可想象的部分上使用“npm uninstall”。没有一个可以完全摆脱所有包。累了,但找到了这个建议,并在5分钟内解决了我的问题。谢谢Harsh。 - BReddy
1
我不知道package.json、package-lock.json、node_modules、dependencies、local/global differences的目的,也不知道nodejs/npm是如何工作的。我使用一个nodejs模块,这个模块是另一个程序所需的。由于我从不同的目录中使用'npm install'安装了许多不同的模块,我想一次性摆脱它们。其他答案都没有谈论这个问题。使用linux上的'find'命令,我能够在5分钟内摆脱所有东西。不知道为什么没有人发现这很有用。 - BReddy
重要提示是有时候删除node_modules可能需要一些时间,所以在它看起来没有任何动作时,你需要一些耐心。 - undefined

9
// 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(因为在执行 npm 脚本后在 CI 上运行脚本..)所以我只是使用了以下命令: "echo {} > package.json & npm prune" - Rikki

6

实际上没有直接删除的选项。如果你想从package.json中卸载软件包,只需在与package.json相同的目录下执行npm ls命令,并使用npm uninstall <name>npm rm <name>来删除所需的软件包。


9
我知道如何单独删除它们——如果有一种像npm install这样的命令可以针对package.json文件运行,那将更加合理。 - qodeninja
不,我们不想手动卸载每个模块。 - shinzou

6

首先,从package.jsondependenciesdevDependencies中删除所有包。

其次,运行npm install即可。

就这么简单。


没有删除所有文件夹,但移除了大部分文件,使得文件资源管理器能够删除剩余的文件。 - Jonathan Twite

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

"npm i"不仅会安装缺少的依赖项,还会更新node_modules以匹配package.json。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接