如何跳过从package-lock.json
安装可选依赖项 npm ci
?
你可以使用 npm ci --no-optional 。如果 npm 仍然安装可选包。然后在删除package.lock.json后尝试并再次运行该命令。
NPM 的 npm ci --no-optional
实现中存在错误。它已在 6.13.3>版本中修复 - 也许也是更早的版本,但我只能保证 6.13.4 及更高版本。
我在使用 CI 工作流脚本时遇到了这个问题,甚至"--no-optional"也不起作用
npm ci --no-optional
上面的命令仅在我将可选包添加为
"optionalDependencies": {
"fsevents": "^2.3.2"
}
在 package.json 文件中
为了使npm ci --no-optional
跳过/忽略可选的 pacakge,了解 package.json 和 pacakge-lock.json npm
如何获取是很重要的。
-
npm install --no-optional
(仅在 pacakge-lock.json 不存在时才有效,否则它将忽略 --no-optional)* -
npm ci --no-optional
仅在 pakcage-lock.json 已经使用npm install --no-optional
** 创建时才有效。
* 这意味着如果你想让已经安装的软件包成为可选的,你可以
"optionalDependencies":
添加它,无论是通过人工还是通过npm install pacakge-name --save-optional
- 删除 pacakge-lock.json。
- 然后运行
rm -rf node_modules/
- 最后运行
npm install --no-optional
- 添加这一点
npm ci --no-optional
不应该安装它。
** TIP:您可以通过运行npm ls package-name
来调试某个包是否被分配为可选
注意:这是为什么它建议使用项目的git repo保留trak pacakge-lock.json的原因。
这不是一个正确的解决方案,而是一个丑陋的解决方案,但它帮助了我。看起来npm ci --no-optional
不起作用,可能从未奏效。但与此同时,旗帜--production
有效。如果我们提供变异package.json
(例如在 docker 容器中),那么......
所以我写了一个简单的脚本:
- 读取
package.json
内容 -
Object.assign(cfg.dependencies, cfg.devDependencies)
-
delete cfg.devDependencies
- 覆盖初始
package.json
所以最后我们有:
-
dependencies
包含正常和开发依赖项 -
devDependencies
部分为空 -
optionalDependencies
完好无损
当我们运行npm ci --production
时,我们得到了我们想要的 - 没有可选的依赖项(在我的情况下cypress
)。由于所有这些步骤都是在 docker 容器内执行的,因此我们可以 改变package.json
.
但我不确定它是否也会帮助你。