Open SyMind opened 2 years ago
将所有 native package 作为 optionalDependencies,然后通过 package.json 中的 os 与 cpu 字段,让 npm/yarn/pnpm 在安装时自动选择符合的 native package。
esbuild package 中:
{ "name": "esbuild", "bin": { "esbuild": "bin/esbuild" }, "optionalDependencies": { "@esbuild/linux-loong64": "0.15.5", "esbuild-android-64": "0.15.5", "esbuild-android-arm64": "0.15.5", "esbuild-darwin-64": "0.15.5", "esbuild-darwin-arm64": "0.15.5", "esbuild-freebsd-64": "0.15.5", "esbuild-freebsd-arm64": "0.15.5", "esbuild-linux-32": "0.15.5", "esbuild-linux-64": "0.15.5", "esbuild-linux-arm": "0.15.5", "esbuild-linux-arm64": "0.15.5", "esbuild-linux-mips64le": "0.15.5", "esbuild-linux-ppc64le": "0.15.5", "esbuild-linux-riscv64": "0.15.5", "esbuild-linux-s390x": "0.15.5", "esbuild-netbsd-64": "0.15.5", "esbuild-openbsd-64": "0.15.5", "esbuild-sunos-64": "0.15.5", "esbuild-windows-32": "0.15.5", "esbuild-windows-64": "0.15.5", "esbuild-windows-arm64": "0.15.5" }, "license": "MIT" }
esbuild-darwin-arm64 package 中:
{ "name": "esbuild-darwin-arm64", "os": [ "darwin" ], "cpu": [ "arm64" ] }
如果依赖可被使用,但你希望当它无法被查找到或安装失败时由 npm 来处理,你需要将它放在 optionalDependencies 配置项中。这是一个 package 名字到版本或 url 的映射,与 dependencies 配置项一样。不同之处在于,构建失败不会导致安装失败。运行 npm install --no-optional 将阻止安装这些依赖项。
npm install --no-optional
你的程序有责任来处理依赖的缺失。例如,类似这样的处理:
try { var foo = require('foo') var fooVersion = require('foo/package.json').version } catch (er) { foo = null } if ( notGoodFooVersion(fooVersion) ) { foo = null } // .. then later in your program .. if (foo) { foo.doFooThings() }
optionalDependencies 中的条目将覆盖 dependencies 中同名的条目,因此通常最好只放在一个位置。
optionalDependencies
dependencies
将所有 native package 作为 optionalDependencies,然后通过 package.json 中的 os 与 cpu 字段,让 npm/yarn/pnpm 在安装时自动选择符合的 native package。
esbuild package 中:
esbuild-darwin-arm64 package 中:
optionalDependencies 介绍
如果依赖可被使用,但你希望当它无法被查找到或安装失败时由 npm 来处理,你需要将它放在 optionalDependencies 配置项中。这是一个 package 名字到版本或 url 的映射,与 dependencies 配置项一样。不同之处在于,构建失败不会导致安装失败。运行
npm install --no-optional
将阻止安装这些依赖项。你的程序有责任来处理依赖的缺失。例如,类似这样的处理:
optionalDependencies
中的条目将覆盖dependencies
中同名的条目,因此通常最好只放在一个位置。