npm命令卸载或修剪Node.js中未使用的软件包


414

有没有一种方法可以简单地从Node.js项目中卸载所有未使用的(未声明的)依赖项(在我中不再定义的依赖项)package.json。当我更新应用程序时,我希望自动删除未引用的包。


1
未使用过什么?您是node_modules要从各自的文件夹中删除文件夹package.json吗?
SLaks 2014年

1
确切地说,mhm npm ll已经给出了一个很好的提示,表明哪些是候选对象。
Tarion 2014年

Answers:


670

注意npm启用程序包锁定后,最新版本会自动执行此操作,因此,除了使用带有--production标志的开发程序包删除以外,这不是必需的。


运行npm prune以删除未列出的模块package.json

来自npm help prune

此命令删除“外部”软件包。如果提供了软件包名称,则仅删除与提供的名称之一匹配的软件包。

无关软件包是未在父软件包的依赖项列表中列出的软件包。

如果--production指定了标志,则此命令将删除在devDependencies中指定的软件包。


3
如果我没有看错,这将删除所有子依赖项,因为它们未在中列出package.json。那正确吗?因此,下一次更新或安装将不得不重新安装它们。
nshew 2014年

1
是的,它将删除子依赖性。子依赖关系实际上存储在模块自己的node_modules目录中,因此它们与模块一起删除。
Darkhogg

2
让我举个例子吧。我从我的package.json手上删除业力,但留下凉亭。当我运行时npm prune,我希望所有业力,包括它自己的node_modules包含依赖项的文件夹,都将被删除。那么Bower的依赖项(bower-json,bower-logger,chmodr,fstream,glob等)如何呢?从技术上讲,这些不在我的项目的中列出package.json。那些被去除了吗?
nshew 2014年

3
不,他们不是。请注意,它们不是您自己的node_modules,而是在内部 node_modules/bower/node_modules受的“保护” node_modules/bower/package.json。包的依赖关系和包的依赖关系没有混合在一起
Darkhogg

2
在安装npm之前删除您的收缩包装,应该已经在上述说明中进行了。
安迪·雷

306

如果你不担心一两分钟的时间这样做,一个解决办法是rm -rf node_modulesnpm install再次来重建本地模块。


93
如果人们不加评论就停止投票,那就太好了。这是重置节点项目依存关系的一种有效策略,可以替代公认的答案。如果您损坏了node_modules子目录的内容(使用符号链接的依赖关系很容易做到),或者您进行了其他更改(例如node或npm版本),则prune不会正确清理node_modules文件夹,但是此答案可以。
皮尔斯(Pyrce)2013年

41
重建node_modules还会验证package.json文件是否描述了可重现的依赖关系图。删除并重新安装您node_modules的计算机基本上是一个部署测试。
joemaller

2
@joemaller不一定,大多数部署工作流都具有隐式或显式的某种缓存。如果软件包已经安装并且符合规格,则保留该软件包。删除然后重新安装将使该软件包到匹配的最新版本。
Darkhogg

7
npm prune没有帮助一个IOTA,但这确实。我的问题是符号链接断开。
Eirik Birkeland

8
在npm当前无法实现的许多非理想情况下。同样,这个问题绝对没有对重复工作或附加获取指定任何限制,只是如何实现最终目标。尽管其他人可能想要达到该目标,但这个答案满足了上述问题。
皮尔斯(Pyrce)

10

您可以使用npm-prune删除无关的软件包。

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]

此命令删除“外部”软件包。如果提供了软件包名称,则仅删除与提供的名称之一匹配的软件包。

无关软件包是未在父软件包的依赖项列表中列出的软件包。

如果指定了--production标志或将NODE_ENV环境变量设置为production,则此命令将删除devDependencies中指定的软件包。设置--no-production将否定NODE_ENV设置为生产

如果--dry-run标志,那么实际上将不会进行任何更改。

如果使用--json标志,则对npm prune进行更改(或使用--dry-run进行更改))都将打印为JSON对象。

在启用包锁的正常操作中,安装模块时会自动修剪无关模块,并且只需要在--production中使用此命令标志的。

如果您禁用了包锁,那么多余的模块将不会被删除,由您不时运行npm prune来删除它们。

使用npm-dedupe减少重复

npm dedupe
npm ddp

搜索本地软件包树,并尝试通过将依赖关系进一步移到树上来简化整体结构,在此树中,多个依赖软件包可以更有效地共享它们。

例如,考虑以下依赖关系图:

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10

在这种情况下,npm-dedupe会将树转换为:

 a
 +-- b
 +-- d
 `-- c@1.0.10

由于节点模块查找的分层性质,b和d都将在树的根级别上由单个c包满足它们的依赖关系。

重复数据消除算法会遍历树,即使未找到重复项,也将每个依赖关系尽可能地移到树中。这将导致平面树和重复数据消除树。


运行npm重复数据删除,node_modules文件夹中有更多项目。叹!
内维尔,
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.