如何跳过通过"npm ci"安装可选依赖项?



如何跳过从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如何获取是很重要的。

  1. npm install --no-optional(仅在 pacakge-lock.json 不存在时才有效,否则它将忽略 --no-optional)*
  2. npm ci --no-optional仅在 pakcage-lock.json 已经使用 npm install --no-optional ** 创建时才有效。

* 这意味着如果你想让已经安装的软件包成为可选的,你可以

  1. "optionalDependencies":添加它,无论是通过人工还是通过npm install pacakge-name --save-optional
  2. 删除 pacakge-lock.json。
  3. 然后运行rm -rf node_modules/
  4. 最后运行npm install --no-optional
  5. 添加这一点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 .

但我不确定它是否也会帮助你。

最新更新