NPM 可以忽略锁定文件中特定于平台的包(例如,linux、darwin 等)

问题描述 投票:0回答:1
使用快速本机二进制文件的节点包通常将它们作为依赖项分发到依赖于体系结构的包中,然后在 package-lock.json 中获取自己的条目。当此锁定文件被签入并由其他平台上的其他人获取时,

npm ci

 将很高兴地安装“不正确”的平台软件包,但 cli 命令将因缺少软件包错误而失败。即使您没有混合平台团队,如果您使用 Docker 或 GitHub 操作,仍然可能会遇到问题。

npm 或任何其他包管理器中是否有一种通用方法可以忽略锁定中的特定依赖项并在每次执行安装时解析它们?

例如,在 Linux 上安装 Vite 5 时,会添加 rollup 的锁定条目,最终

@esbuild/linux-x64

,这在 Mac 上不起作用。 esbuild 有一个 wasm 包可以用来代替,但这对于其他包来说也是一个问题(例如@tauri-app/cli)。

我想要的是能够拉出一个项目并能够运行

npm ci

npm i
 并让它实际为我的平台安装依赖项二进制文件,而不仅仅是锁定文件中的内容。

我考虑过的不是很好的解决方案:

    有一个简单的解决方法,只需删除锁定文件和 node_modules 目录并再次运行
  1. npm i
    ,但这标志着锁定文件已修改。您还可以从存储库中删除并忽略锁定文件。然而,这两者都有可能导致其他问题。
  2. Overrides 是另一种实现方式,但包必须提供独立于平台的包,而且它们并不都这样做,而且它们并不总是完全兼容。
  3. 您可以使用安装后脚本手动安装当前架构所需的所有软件包,但这看起来很混乱,并且如果嵌套依赖项发生变化,很容易破坏。
node.js npm npm-install
1个回答
0
投票
经过几个小时尝试各种手动安装方法后,我实际上找到了解决方案。在 package.json 中,您可以设置文档指出的“cpu”和“os”选项,用于指定模块将在其上运行的平台。目前尚不清楚,但这样做的一个效果是,将为每个相关软件包的每个 os/cpu 组合创建一个锁定条目,并且当运行

npm ci 时,只有相关软件包将安装在目标系统上。

例如:

package.json
    中,添加以下内容(以及根据需要添加更多内容):
  • "os": ["darwin", "linux", "windows"], "cpu": ["x64", "arm64"],
    
    
    删除 
    package-lock.json
  • 并运行
  • npm install
    
    
    具有特定于平台的选项的依赖项现在应该在每个组合的锁定文件中都有一个条目:
    
    vite@^5.4.8 \[email protected] |-@esbuild/[email protected] |-@esbuild/[email protected] |-@esbuild/[email protected] \- ...etc
  • 因此,解决方案不是“忽略”平台上的锁定,而是过度指定可能运行构建工具的任何平台。

© www.soinside.com 2019 - 2024. All rights reserved.