|
| 1 | +--- |
| 2 | +name: install-native-binding |
| 3 | +description: '安装 npm 依赖并确保 Linux native binding 正确生成。在非 Linux 系统上通过 docker/podman 以 linux/amd64 容器执行安装,保证 lockfile 中包含跨平台 native binding。Use when installing dependencies, fixing missing native bindings, or syncing package-lock.json for Linux environments.' |
| 4 | +user-invocable: true |
| 5 | +--- |
| 6 | + |
| 7 | +# Install Native Binding Skill |
| 8 | + |
| 9 | +## 适用场景 |
| 10 | + |
| 11 | +- 安装/更新 npm 依赖后需要确保 Linux native binding 正确写入 lockfile |
| 12 | +- 在 macOS / Windows 开发机上需要为 Linux 生产环境生成正确的 lockfile |
| 13 | +- CI 报告缺少 native binding 或 optionalDependencies 平台条目 |
| 14 | + |
| 15 | +## 执行步骤 |
| 16 | + |
| 17 | +### 1. 检测当前操作系统 |
| 18 | + |
| 19 | +运行 `uname -s` 获取系统类型。 |
| 20 | + |
| 21 | +- 若输出为 `Linux`,进入**步骤 2(Linux 路径)**。 |
| 22 | +- 否则(macOS、Windows 等),进入**步骤 3(非 Linux 路径)**。 |
| 23 | + |
| 24 | +### 2. Linux 路径 |
| 25 | + |
| 26 | +直接在当前环境运行: |
| 27 | + |
| 28 | +```bash |
| 29 | +npm i --include-workspace-root --workspaces |
| 30 | +``` |
| 31 | + |
| 32 | +完成后跳至**步骤 5**。 |
| 33 | + |
| 34 | +### 3. 非 Linux 路径 —— 检测容器运行时 |
| 35 | + |
| 36 | +依次检查以下命令是否可用: |
| 37 | + |
| 38 | +```bash |
| 39 | +command -v docker |
| 40 | +command -v podman |
| 41 | +``` |
| 42 | + |
| 43 | +- 若两者均不可用,**停止执行**,告知用户需要安装 Docker 或 Podman 后重试。 |
| 44 | +- 优先使用 `docker`;若 `docker` 不可用则使用 `podman`(以下统称 `<runtime>`)。 |
| 45 | + |
| 46 | +### 4. 非 Linux 路径 —— 读取 Node 版本并在容器中安装 |
| 47 | + |
| 48 | +#### 4a. 读取 Node 版本 |
| 49 | + |
| 50 | +读取仓库根目录的 `.nvmrc` 文件,获取版本号(去掉前缀 `v`),作为镜像 tag。 |
| 51 | + |
| 52 | +例如 `.nvmrc` 内容为 `v24.12.0`,则镜像为 `node:24.12.0`。 |
| 53 | + |
| 54 | +#### 4b. 在容器中执行安装 |
| 55 | + |
| 56 | +```bash |
| 57 | +<runtime> run --rm --platform linux/amd64 \ |
| 58 | + -v "$PWD":/src \ |
| 59 | + --tmpfs /src/node_modules:exec \ |
| 60 | + node:<version> \ |
| 61 | + bash -lc 'cd /src && npm i --include-workspace-root --workspaces' |
| 62 | +``` |
| 63 | + |
| 64 | +- 挂载当前工作目录为 `/src`(读写,不加 `:ro`),使安装结果(`node_modules`、`package-lock.json`)直接写回宿主机。 |
| 65 | +- `--tmpfs /src/node_modules:exec` 将容器内的根 `node_modules` 挂载为内存文件系统,避免宿主机的 `node_modules` 被覆盖,同时加速安装;`:exec` 允许 postinstall 脚本执行二进制文件(Docker tmpfs 默认带 `noexec`)。 |
| 66 | +- `--platform linux/amd64` 确保 native binding 以 Linux x64 平台编译/下载。 |
| 67 | + |
| 68 | +## 约束 |
| 69 | + |
| 70 | +- 容器挂载目录为当前工作区根目录(即含 `package.json` 和 `package-lock.json` 的目录) |
| 71 | +- 不要在容器内部 `cp` 文件;直接挂载读写以避免权限问题 |
| 72 | +- Node 镜像版本必须严格来自 `.nvmrc`,不得硬编码或猜测 |
0 commit comments