删除所有全局安装的npm模块的命令

465

有没有一条命令可以删除所有全局npm模块?如果没有,你有什么建议?

31个回答

601

以下命令可删除所有全局 npm 模块。注意:此命令在 Windows 上不起作用。Windows 版本的工作方式请参见Ollie Bennett's Answer

npm ls -gp --depth=0 | awk -F/ '/node_modules/ && !/\/npm$/ {print $NF}' | xargs npm -g rm

以下是实现的步骤:

  • npm ls -gp --depth=0 列出所有全局的顶层模块(参见ls命令行文档
  • awk -F/ '/node_modules/ && !/\/npm$/ {print $NF}' 打印出不实际属于npm本身的所有模块(不以/npm结尾)
  • xargs npm -g rm 删除来自前一个管道的所有全局模块

6
不要成为awk高手,这个可以用一条单独的awk命令完成,无需grep: awk -F' |@' '/@/ {if ($(NF-1) != "npm") {print $(NF-1)}}'解释:按空格或@分割,只匹配带有@的行,模块名称将是倒数第二个匹配项 ($(NF-1)),只有在它不是 npm 的情况下才打印。 - Fotios
31
警告:新版本不会过滤掉npm模块。您不想移除那个模块。 - neverfox
11
我也在没有阅读评论的情况下运行了新版本。一定要阅读评论。以下是如何恢复NPM: 使用以下命令来下载并运行安装脚本: curl https://www.npmjs.org/install.sh | sh - Jack Allan
16
哇,NPM卸载包真的不容易。使用Bundler和Gems来卸载所有内容是微不足道的,而必须使用grep等工具实在是一种可怕的设计。有没有更简单的方法来做到这一点?谁能记得答案所需的代码呢? - Brian Dear
16
@neverfox等人:问题已经修复,现在npm本身不再被删除。对于给大家带来的困扰,我们深感抱歉。 - Kai Sternad
显示剩余13条评论

333

对于使用Windows的用户来说,最简单的方法是删除以下文件夹中的所有全局安装的npm包:

C:\Users\用户名\AppData\Roaming\npm

你可以通过在资源管理器、运行提示符或开始菜单中输入%appdata%/npm来快速到达该目录。


7
谢谢您的提问。您是否需要删除npm-cache呢? - Neil
4
如果有npm文件夹,请勿删除。 - AutomatedMike
3
我在重新安装所有包时,再次运行npm install时遇到了EINTEGRITY错误。 我不得不同时删除我的package-lock.json文件。 - ToastyMallows
1
@Neil npm cache clean --force - Yatin Kanyal
1
如果你在Windows上使用nvm,那么你的node_modules文件夹将位于C:\Users\[用户名]\AppData\Roaming\nvm\[版本号]\node_modules - Tim Hutchison
显示剩余3条评论

185

我尝试了 Kai Sternad 的解决方案,但是我认为它并不完美。在依赖树中最后一个 awk 后面还有很多特殊符号。

因此,我自己修改了 Kai Sternad 的解决方案(参考了 cashmere 的想法):

npm ls -gp --depth=0 | awk -F/node_modules/ '{print $2}' | grep -vE '^(npm|)$' | xargs -r npm -g rm

npm ls -gp --depth=0 列出了所有全局安装的npm模块,并以可解析的格式展示:

/home/leonid/local/lib
/home/leonid/local/lib/node_modules/bower
/home/leonid/local/lib/node_modules/coffee-script
...

awk -F/node_modules/ '{print $2}' 的作用是从路径中提取模块名称,形成所有全局安装模块的列表。

grep -vE '^(npm|)$' 的作用是删除npm自身和空行。

xargs -r npm -g rm 将对列表中每个模块调用 npm -g rm 命令进行卸载。

与Kai Sternad的解决方案一样,它只能在*nix下运行。


1
这些文件存放在哪里,我讨厌这种方法。难道就没有一个全局的 package.json 文件吗? - Evan Carroll
2
@EvanCarroll 不是的,没有这个文件,但 npm 将其所有全局模块安装到同一个目录中。确切位置可能会有所不同,但通常在 /usr/local/lib/node_modules 目录下。 - Leonid Beschastny
3
了解,这个也会移除npm。 - BrDaHa
11
这个命令可在OSX上使用,它不会删除npm,并且作用是列出全局安装的npm包并移除它们。具体命令为:npm ls -gp --depth=0 | awk -F/node_modules/ '{print $2}' | grep -vE '^(npm)$' | xargs npm -g rm - real_ate
4
这个命令无法处理作用域包(例如 @angular/cli)。我为 awk 添加了另一个匹配器,我的工作命令看起来像这样:npm ls -gp --depth=0 | awk -F/ '/node_modules\/@/ {print $(NF-1)"/"$NF} /node_modules\/[^@]/ && !/\/npm$/ {print $NF}' | xargs npm -g rm - Jack Q
显示剩余8条评论

81
sudo npm list -g --depth=0. | awk -F ' ' '{print $2}' | awk -F '@' '{print $1}'  | sudo xargs npm remove -g

对我很有用

  • sudo npm list -g --depth=0. 列出所有顶级安装的包
  • awk -F ' ' '{print $2}' 去除 ├── 符号
  • awk -F '@' '{print $1}' 获取 @ 之前的内容
  • sudo xargs npm remove -g 在全局范围内移除该软件包

这个版本在2014年6月对我来说效果最好。唯一的补充可能是从列表中过滤掉“UNMET”依赖项,但这并不重要,因为npm remove UNMET只是NOOP。 - kangax
7
为了防止删除npm本身,您可以在命令中添加grep -v npmsudo npm list -g --depth=0. | grep -v npm | awk -F ' ' '{print $2}' | awk -F '@' '{print $1}' | sudo xargs npm remove -g。该命令的作用是列出全局安装的npm包,并将它们逐一卸载。 - brauliobo
你的npm已经准备好了! - All Іѕ Vаиітy
即使在2023年的新M2上,这也帮助我解决了一些奇怪的问题,尝试构建一个项目。 - Stuart
即使在2023年的全新M2上,这也帮助我解决了一些奇怪的问题,试图构建一个项目。 - undefined

32

对于那些使用Powershell的人:

npm -gp ls --depth=0 | ForEach-Object { Get-Item $_ } | Where { $_.Name -ne 'npm' } | ForEach-Object { npm rm -g $_.Name }

清除缓存:

npm cache clear

26

喜欢这个。更快更简单 :) 我只是在 tr 之前使用了 grep -v npmn - apnerve

22

如果您想要删除所有已安装的包,可以使用 npm -g ls 命令查找它们,然后使用 npm -g rm 命令将其删除。


19

在Windows操作系统中,前往“C:\Users{用户名}\AppData\Roaming”目录,并手动删除npm文件夹。


2
这对我们在Windows上来说很直接/有用。谢谢。 - rob2d

17
如果您已经安装了jq,那么即使没有grep/awk/sed也可以进行操作。
npm ls -g --json --depth=0 |
  jq -r '.dependencies|keys-["npm"]|join("\n")' |
  xargs npm rm -g

在Debian及其衍生版本上,您可以使用以下命令安装jq

sudo apt-get install jq

这是一个具有恰当的json风格的扎实答案。 - Richard Ayotte
1
如果需要sudo权限,则执行以下命令:npm ls -g --json --depth=0 | jq -r '.dependencies|keys-["npm"]|join("\n")' | xargs sudo npm rm -g - Roger

5
对于操作系统未指定的情况。在 Windows 上,此脚本可用于清除本地和用户全局模块及缓存。我发现在 Linux 上,全局根目录确实是对整个系统而言的,而不是给定用户,因此删除全局根可能不适合共享系统。另外,如果有兴趣,我可以将该脚本移植到 Bash。对于 Windows,请保存为cmd文件以运行。
@ECHO OFF
SETLOCAL EnableDelayedExpansion 
SETLOCAL EnableExtensions

SET /A ecode=0

:: verify
SET /P conf="About to delete all global and local npm modules and clear the npm cache. Continue (y/[n])?
IF /I NOT "%conf%"=="y" (
  ECHO operation aborted
  SET /A ecode=!ecode!+1
  GOTO END
)

:: wipe global and local npm root
FOR %%a IN ("" "-g") DO (

  :: get root path into var
  SET cmd=npm root %%~a
  FOR /f "usebackq tokens=*" %%r IN (`!cmd!`) DO (SET npm_root=%%r)

  :: paranoid
  ECHO validating module path "!npm_root!"
  IF "!npm_root:~-12!"=="node_modules" (
    IF NOT EXIST "!npm_root!" (
      ECHO npm root does not exist "!npm_root!"
    ) ELSE (
      ECHO deleting "!npm_root!" ...
      :: delete
      RMDIR /S /Q "!npm_root!"
    )
  ) ELSE (
      ECHO suspicious npm root, ignoring "!npm_root!"
  )
)

:: clear the cache
ECHO clearing the npm cache ...
call npm cache clean

:: done
ECHO done

:END

ENDLOCAL & EXIT /b %ecode%

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