SyMind / learning

路漫漫其修远兮,吾将上下而求索。
9 stars 1 forks source link

esbuild 是如何进行 npm package 分发的 #36

Open SyMind opened 2 years ago

SyMind commented 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"
  ]
}

optionalDependencies 介绍

如果依赖可被使用,但你希望当它无法被查找到或安装失败时由 npm 来处理,你需要将它放在 optionalDependencies 配置项中。这是一个 package 名字到版本或 url 的映射,与 dependencies 配置项一样。不同之处在于,构建失败不会导致安装失败。运行 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 中同名的条目,因此通常最好只放在一个位置。