如何卸载npm包?

69
我使用 sudo npm install grunt 安装了 grunt,现在我无法删除它。
我尝试过:
$ sudo npm uninstall grunt

但它给了我一个 WARN 警告:

npm WARN uninstall not installed in /home/kuba/projects/node_modules: "grunt-cli"
我也尝试过rmremoveunlink,以及 -g 选项,但它们都会产生以下结果:
npm WARN uninstall not installed in /usr/lib/node_modules: "grunt"
但我仍然可以在命令行中运行grunt编辑:
$ whereis grunt
grunt: /usr/local/bin/grunt
$ file /usr/local/bin/grunt
/usr/local/bin/grunt: symbolic link to `../lib/node_modules/grunt/bin/grunt'
$ ls /usr/local/lib/node_modules
grunt jshint
$ ls /usr/lib/node_modules
bower  csslint  devtools-terminal  npm  plato

为什么我有两个npm目录?直接删除它们安全吗?

编辑注:

这个问题是5年前提出的,当时是关于如何卸载npm包的。很多人收藏了这个非常有用的问题,并找到了解决方法,所以我将其从最近的编辑中改回了npm包的任何其他包一样需要使用相同的程序来卸载,而不是改成grunt包的卸载方法。


我觉得我还有旧版本 Xubuntu 的 npm 模块。我从 10 或 11 开始更新到 13.10。我只需删除这些文件即可。 - jcubic
sudo apt-get purge grunt 的输出是什么? - jobin
@Jobin 没有这样的软件包。我还在 Synaptics 中搜索了,但没有找到 grunt。 - jcubic
@Jobin 可能是安装了旧版本的 nmp,当 Xubuntu 更新 npm 时,这些文件就留在那里了。 - jcubic
尝试运行 npm update,然后运行 npm uninstall grunt - Visakh B Sujathan
6个回答

115

要从项目的node_modules文件夹中卸载npm模块,请运行:

npm uninstall <module> --save

请注意,运行此命令时应该从包含node_modules文件夹的同一目录中卸载npm模块。 --save选项还将从您的package.json中删除它。

也可以通过从本地node_modules文件夹中删除其目录来删除本地依赖/模块安装。 是的,在那里删除依赖是安全的。

要卸载全局安装的npm模块,请运行:

npm uninstall -g <module>

无论在哪里运行此命令都没有关系。

要安装npm模块,请运行:(仅供参考)

npm install <module>

...或:

npm install(如果在您的项目根目录下有一个package.json文件)

...或:

npm install <module> --save-dev(如果你想要在依赖中添加最低版本)

关于Grunt的好事情:

如果你在2013年2月18日(即grunt v0.4.x发布的那一天)之前安装了稳定版的grunt,那么你可能仍然在系统中保留着旧版本的grunt。这是因为低于0.4.xgrunt版本是全局安装的,这在升级/维护版本时会带来很多痛苦。 gruntgrunt-cli是两个不同的东西。 grunt(没有"cli")通常在项目级别上安装(当在package.json中列为devDependency时)通过运行npm install。这也被称为本地安装。 grunt-cli是本地版本的grunt在不同的项目/文件夹中运行的基础。它可以在本地安装,但在全局安装一次后更有用。
只有在本地安装grunt(通过运行npm install grunt)。
最好全局安装grunt-cli(通过运行npm install -g grunt-cli)。grunt-cli官方的npm页面仍然警告不要全局安装grunt(没有cli)。
如果你想卸载全局安装的grunt-cli,运行npm uninstall -g grunt-cli这个问题gruntjs项目中支持此过程。 永远不要全局安装grunt(通过运行npm install -g grunt)。

关于npmsudo

sudonpm不兼容。仅在必要时使用它。以下是两个关于其使用优缺点的引用:

引用Isaac Z. Schlueter在他的Introduction to npm文章中的话:

我强烈建议您不要使用sudo进行软件包管理! 软件包可以运行任意脚本,这使得sudo命令作为软件包管理器命令变得不安全。 当然,它很快,肯定会穿过任何障碍,但您可能真的希望那个障碍留在那里。

我建议您只执行一次以下操作:

sudo chown -R $USER /usr/local

这将把您的用户帐户设置为/usr/local目录的所有者,以便您可以在其中发出普通命令。然后您就不需要在安装node或发出npm命令时使用sudo了。

这样做更好。毕竟,/usr/local应该是您安装的东西。

另一个由Andrei Karpushonak提到的问题是:

更改/usr/local的所有权存在某些安全问题和功能限制:

尽管如此,如果您想在不使用sudo的情况下安装全局模块, 我认为没有比这更好的解决方案(从实用角度考虑)。 安全性与易用性是非常广泛的话题,对于这个问题并没有简单的答案 - 这取决于您的要求。


这个对我没用:npm uninstall packagename --save,但这个可以:npm uninstall --save packagename。标记的位置似乎很重要。 - arnoldbird

6
这件事也发生在我身上。在执行操作时,出现了同样的情况。
which grunt

我得到了路径 /usr/local/bin/。里面有一个名为 grunt 的文件夹。 但是在运行命令时(即使在路径 /usr/local/bin/ 中运行),出现了问题:

sudo npm uninstall -g grunt

收到了“卸载未安装”的警告

解决方案:原来我是使用命令进行安装的。

sudo npm install -g grunt-cli

当我试图删除时,只需要输入grunt命令。

因此,一旦运行:

sudo npm uninstall -g grunt-cli 

grunt已被移除。

虽然您在问题中提到运行了

sudo npm install grunt

但仍需检查是否也犯了同样的错误,并使用grunt-cli运行它。


3
在某些情况下,可能需要使用npm的“删除包”功能。 npm - 删除一个包 描述
“这将卸载一个包,完全删除npm代表其安装的所有内容。”
在您的第三个代码块中,您发布了此消息:
npm WARN uninstall not installed in /home/kuba/projects/node_modules: "grunt-cli"

我发现使用 标签可以更好地强调代码。
which grunt 

或者是
whereis grunt 

CLI/控制台中的命令提供了不完整且令人困惑的输出。
这两个命令将返回 grunt-cli 安装路径,但仅会返回 grunt
同时也可以使用:
which grunt-cli

或者

whereis grunt-cli

无法在CLI控制台中返回任何输出。我认为这是npm的命名空间问题/特性。

我还遇到了一个情况,无法像其他贡献者建议的那样使用npm的卸载函数卸载grunt-cli。

唯一有效的方法是使用下面演示的npm remove函数和程序的完整名称

npm rm -g grunt-cli

这将在你的控制台中返回以下结果。
unbuild grunt-cli@#.##.#

祝你好运!


奇怪的是,这对我也没有用。我只是删除了我的节点bin文件夹中的软链接。之后,我就能够毫无问题地使用npm install -g grunt-clinpm rm -g grunt-cli了。 - Andy

2

首先使用以下命令:

which grunt-cli

或者使用以下命令:

which grunt

这将显示模块的路径。

在我的情况下,它位于/usr/local/bin/中。

一旦进入bin文件夹,只需输入以下命令:

sudo rm grunt

就完成了 :)


1
如果是全局安装,请在uninstall后添加-g,可能需要使用sudo
sudo npm uninstall -g grunt 

0

运行已接受的解决方案命令对我没有用。 运行which grunt将导致/usr/local/bin/grunt,但正常(或sudo)npm uninstall -g grunt-cli没有效果。

这是最终对我有用的命令:

sudo npm uninstall grunt-cli -g --prefix=/usr/local

感谢github上的gengxuelei提供的解决方案!

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