package-lock.json 中的 `"dev" true` 是做啥用的?

Posted

技术标签:

【中文标题】package-lock.json 中的 `"dev" true` 是做啥用的?【英文标题】:What is `"dev" true` in package-lock.json for?package-lock.json 中的 `"dev" true` 是做什么用的? 【发布时间】:2018-09-23 08:53:27 【问题描述】:

"dev" truepackage-lock.json 文件中是什么意思?

在我的情况下,它会在我执行npm 操作时自动更新。

我们怎样才能删除它?

【问题讨论】:

package-lock.json 有很多谜团。除了 dev 这个东西之外,哈希有时有一个较长的版本和一个较短的版本。 【参考方案1】:

来自https://docs.npmjs.com/files/package-lock.json的 npm 文档

如果为 true,则此依赖项要么是仅顶层模块的开发依赖项,要么是一个传递依赖项。这对于既是顶层的开发依赖又是顶层非开发依赖的传递依赖的依赖是错误的。

【讨论】:

你能简单解释一下吗? 我们为什么需要它? 我的package-lock.json 文件在不断变化。在大多数情况下,唯一的区别是包含或删除“dev: true”!鉴于其所谓的目的,我当然不会在它和“devDependencies”之间移动依赖关系,所以我不明白为什么我会看到这种变化。 简化版:如果包添加为 dev-dependency 并且还被 dev-dependencies 中的其他包使用,则 dev: true。如果依赖项中的 至少一个 包需要该包 - npm 会切换它dev: false 一个传递依赖的例子是:如果 packageA 依赖 packageB 作为 development 依赖,而 packageB 依赖 packageC 作为 development 依赖,那么 packageC 是 packageA 的传递依赖。跨度> 【参考方案2】:

我认为这一段试图说明包依赖的 dev: true 是如何分配的。

直接开发依赖 -> dev: true 只有间接开发依赖 -> dev: true 但是直接开发依赖 它也有间接的非开发依赖 -> 没有“dev: true”

换句话说,一旦一个开发依赖包被一个非开发包间接依赖,它应该是dev: false,因此它将被包含在构建过​​程中。这条规则的目的是确保非开发包需要的包不会有“dev: true”。

此外,如果通过“npm install -D”安装,则该软件包将作为开发包安装,因此不会发生“dev: true”更改。但是,如果通过“npm install”安装,这可能会删除许多现有的依赖项的“dev: true”属性。

例如,我在我的项目中运行“npm install -D bestzip”,结果是:

53 个带有“dev”的依赖项:添加了 true

运行“npm install bestzip”,结果是:

53 个没有“dev”的依赖项:添加了 true 43 个现有依赖项的“dev”:true 属性已删除

【讨论】:

我们不能说因为某个依赖在 package.json 中的 "devDependencies": .. 下,它的子依赖将附加 "dev": true 以防我们运行 npm install【参考方案3】:

所以回答你的第一个问题,package-lock.json 中的"dev": true 意味着在production 模式下运行时npm install/npm ci 不会安装此依赖项。

将依赖项仅用于标有 "dev": true 的本地开发环境,然后在 CI 中使用 --production 可能会节省一些构建时间。

来自文档https://docs.npmjs.com/cli/install#description:

默认情况下,npm install 将安装列出的所有模块 package.json 中的依赖项。

使用--production 标志(或当NODE_ENV 环境 变量设置为production),npm 将不会安装列出的模块 在devDependencies

【讨论】:

以上是关于package-lock.json 中的 `"dev" true` 是做啥用的?的主要内容,如果未能解决你的问题,请参考以下文章

package-lock.json 中的 `"dev" true` 是做啥用的?

我应该将 `package-lock.json` 复制到 Dockerfile 中的容器映像吗?

package-lock.json 中的 "requires: true" 有啥作用

package.json中的版本和package-lock.json的作用

如何在没有任何副作用的情况下更新 package-lock.json 中的单个依赖项?

text package-lock.json包含不存在于package.json中的不同且有问题的npm包