如何全局卸载 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个回答

2

针对Powershell用户:

foreach($package in ls node_modules){npm uninstall $package}

感谢@JustMailer的最初回答。


2

(在您阅读完整篇文章之前,请勿复制这些步骤)

对我来说,所有提到的解决方案都没有起作用。所以我去了/usr/lib并在那里运行了以下命令:

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

但它也删除了npm包,并且只有一半的软件包(直到它达到字母n)。

所以我尝试按照Node指南重新安装Node。

# 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和已链接的包。


1
基于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' ' '`

1

即使您不需要运行循环也可以完成。

您可以使用单个命令删除所有的node_modules文件夹:

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

1

由于在谷歌搜索如何删除NPM中的所有模块仍然是第一个结果,我想分享一个用于Powershell的小脚本,以通过NPM删除所有依赖项:

#Create a Packages Array to add package names to
$Packages = New-Object System.Collections.ArrayList

#Get all Production Dependencies by name
(Get-Content .\Package.json | ConvertFrom-JSON).dependencies.psobject.properties.name |
ForEach-Object { $Packages.Add($_) | Out-Null }

#Get all Dev Dependencies by name
(Get-Content .\Package.json | ConvertFrom-JSON).devDependencies.psobject.properties.name | 
ForEach-Object { $Packages.Add($_) | Out-Null }

#Remove each package individually
Foreach($Package in ($Packages | select -unique))
{ npm uninstall $Package }

#Clean up any remaining packages
$Modules = Get-ChildItem "node_modules"
if($Modules)
{ $Modules | ForEach-Object { Remove-Item ".\node_modules\$_" -Force -Recurse } }

这将运行更具体的删除操作,而不是逐个从node_modules中删除每个模块。

0

您只需删除node_modules文件夹,然后导航到您的Angular应用程序文件夹,然后运行以下命令之一。

  • 在Windows上:
rmdir /s node_modules 
  • 在Linux上:
rm -r node_modules/

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