# npm dedupe

减少重复

# 概要

npm dedupe

alias: 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 包满足它们的依赖关系。

在某些情况下,你可能会有这样的依赖图:

a
+-- b <-- depends on c@1.0.x
+-- c@1.0.3
`-- d <-- depends on c@1.x
    `-- c@1.9.9

在安装过程中,b 的 c@1.0.3 依赖项被放置在树的根位置。虽然 d 对 c@1.x 的依赖可以通过 c@1.0.3 得到满足,但是使用了更新的 c@1.9.0,因为 npm 默认支持更新,即使这样做会导致重复。

运行 npm dedupe 会导致 npm 注意到这个重复并重新计算,删除嵌套的 c 模块,因为根目录中的那个已经足够了。

为了在安装过程中偏好重复数据删除而非新增,请运行 npm install --prefer-dedupenpm dedupe set prefer-dedupe true

如果参数被忽略。重复数据删除总是作用于整个树。

注意,这个操作会转换依赖树,但不会导致安装新模块。

使用 npm find-dupes 命令将在 --dry-run 模式下执行命令。

注意: npm dedupe 永远不会更新项目 package.json 中直接依赖项的 semver 值,如果你想更新 package.json 中的值,你可以运行: npm update --save

# 配置

# global-style

  • Default: false
  • Type: Boolean

使 npm 以与全局 node_modules 文件夹相同的布局将包安装到本地 node_modules 文件夹。您的直接依赖项将在 node_modules 中显示,它们所依赖的一切将在其 node_modules 文件夹中扁平化。这显然会消除一些重复数据删除。如果与 legacy-bundling 一起使用,legacy-bundling 优先。

# legacy-bundling

  • Default: false
  • Type: Boolean

使 npm 安装包,以便 1.4 之前的 npm 版本(例如 node 0.8 中包含的版本)可以安装包。这消除了所有自动重复数据删除。如果与 global-style 此选项一起使用 legacy-bundling 将是首选。

# strict-peer-deps

  • Default: false
  • Type: Boolean

如果设置为 true ,并且没有设置 --legacy-peer-deps,则任何冲突 peerDependencies 都将被视为安装失败,即使 npm 可以根据非对等依赖关系合理地猜测适当的解决方案。

默认情况下,peerDependencies 将使用最近的非对等依赖规范来解决依赖关系图中的冲突,即使这样做会导致某些包收到超出其包 peerDependencies 对象中设置的范围的对等依赖项。

当执行此类和覆盖时,将打印一个警告,解释冲突和涉及的包。如果设置了 --strict-peer-deps,则此警告将被视为失败。

# package-lock

  • Default: true
  • Type: Boolean

如果设置为 false,则在安装时忽略 package-lock.json 文件。如果 save 为 true,将阻止写入 package-lock.json

此配置不会影响 npm ci

# omit

  • Default: 'dev' | ''
  • Type: "dev", "optional", or "peer" (可以设置多次)

要从磁盘上的安装树中省略的依赖类型。

注意

这些依赖项仍然被解析并添加到 package-lock.jsonnpm-shrinkwrap.json 文件中。

如果包类型同时出现在 --include--omit 列表中,那么它将被包括在内。

如果结果省略列表包括 dev,则 NODE_ENV 环境变量将设置 production 为所有生命周期的脚本。

# ignore-scripts

  • Default: false
  • Type: Boolean

如果为 true, npm 不会运行包中指定的 package.json 文件。

注意

如果设置了 ignore-scripts,那些显式地想要运行特定脚本的命令,比如 npm startnpm stopnpm restartnpm testnpm run-script 仍然会运行它们想要运行的脚本,但是它们不会运行任何前脚本或后脚本。

# audit

  • Default: true
  • Type: Boolean

当为 "true" 时,将检查报告和当前 npm 命令一起提交到默认注册中心和所有配置了作用域的注册中心。具体提交内容请参见 npm audit 文档。

  • Default: true
  • Type: Boolean

告诉 npm 为包可执行文件创建符号链接(或 Windows 上的 .cmd 连接器命令文件)。

设置为 false 使其不执行此操作。这可以用来解决某些文件系统不支持符号链接的事实,即使在表面上是 Unix 系统上也是如此。

# fund

  • Default: true
  • Type: Boolean

当为 “true” 时,在每个 npm install 的末尾显示一条消息,确认寻求资助的依赖关系的数量。详见 npm fund

# dry-run

  • Default: false
  • Type: Boolean

表示您不希望 npm 进行任何更改,并且只报告它应该做的事情。这可以传递到任何修改本地安装的命令中,例如:install, update, dedupe, uninstall 以及 pack 和 publish。

注意

其他相关命令不支持此功能,例如 dist-tags, owner 等。

# workspace

  • Default:
  • Type: String (可以设置多次)

启用在当前项目的已配置工作区的上下文中运行命令,同时通过仅运行此配置选项定义的工作区进行过滤。

workspace 配置的有效值如下:

  • 工作区名称
  • 工作区目录的路径
  • 父工作区目录的路径(将导致选择该文件夹中的所有工作区)

npm init 命令设置时,可以将其设置为尚不存在的工作空间的文件夹,以创建文件夹并将其设置为项目中的全新工作空间。

此值不会导出到子进程的环境中。

# workspaces

  • Default: null
  • Type: null or Boolean

设置为 true 将在所有配置的工作区中运行该命令。

显式地将此设置为 false 将导致如下命令 install 完全忽略工作空间。当没有显式设置时:

  • node_modules 树上操作的命令 (install, update, etc.) 时,将把工作区链接到 node_modules 文件夹中。做其他事情的命令 (test, exec, publish, etc.) 将在根项目上操作,除非在 workspace 配置中指定了一个或多个工作空间。

此值不会导出到子进程的环境中。

# include-workspace-root

  • Default: false
  • Type: Boolean

当为某个命令启用工作区时,请包含工作区根目录。

当为 false 时,通过 workspace 配置指定单个工作空间,或通过 workspaces 标志指定所有工作空间,将导致 npm 仅在指定的工作空间上运行,而不是在根项目上运行。

此值不会导出到子进程的环境中。

  • Default: false
  • Type: Boolean

当设置文件: 存在于项目根目录之外的协议依赖项将被打包并安装为常规依赖项,而不是创建符号链接。此选项对工作区没有影响。

Last Updated: 4/25/2023, 9:49:29 AM