Files
Web_FreeCAD_Bitbybit/docs/project-runtime.zh-CN.md

91 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目运行时基线与“引擎版本警告”解决方案
## 1. 问题结论
本项目的 `package.json` 声明 Node.js `>=22`,而原开发环境实际使用系统 `/usr/bin/node v20.19.2``/usr/bin/npm 9.2.0`。npm 的 `EBADENGINE` 是运行 npm 的解释器版本不满足依赖声明所产生的警告;仅修改 `engines`、PATH 文档或 Vite 配置都不会改变当前解释器。
项目现在锁定 Node.js `22.23.2` 与 npm `10.9.8`,并把官方归档下载到被 Git 忽略的 `.runtime/``./npmw``./nodew``scripts/bootstrap-node.sh` 是项目运行时的唯一启动路径,系统 Node 不会被替换或修改。
版本与校验值来源:
- [Node.js v22.23.2 官方发行目录](https://nodejs.org/dist/v22.23.2/)
- [Node.js 官方 SHA-256 清单](https://nodejs.org/dist/v22.23.2/SHASUMS256.txt)
- [Node.js 官方发行索引](https://nodejs.org/dist/index.json)
## 2. 固定契约
| 项目 | 固定值 | 记录位置 | 目的 |
|---|---|---|---|
| Node | `22.23.2` | `.node-version``.nvmrc``config/node-runtime.env` | 规避同一大版本内的隐式差异 |
| npm | `10.9.8` | `package.json``packageManager``config/node-runtime.env` | 固定 lockfile 生成器 |
| Node 来源 | `nodejs.org` 官方归档 | `scripts/bootstrap-node.sh` | 下载来源可审计 |
| 完整性 | 四平台 SHA-256 | `config/node-runtime.env` | 防止缓存或代理返回错误二进制 |
| 安装目录 | `.runtime/` | `.gitignore` | 不把二进制提交到仓库 |
| 包引擎策略 | `engine-strict=true` | `.npmrc` | 误用旧 Node 时立即失败,不再静默产生警告 |
| 应用入口 | `BitBybitWebCadFacade` | `config/runtime-baseline.json` | React、Three、SQLite、OCCT 均不能绕过 Facade |
## 3. 日常操作
首次安装或依赖变化:
```bash
./npmw install
```
启动开发服务器:
```bash
./npmw run dev
```
全量校验:
```bash
./npmw run verify
```
直接查看项目解释器:
```bash
./nodew --version
./npmw --version
```
期望输出分别为 `v22.23.2``10.9.8`。第一次运行会下载约 30 MB 的 Node Linux x64 归档,后续运行复用校验通过的缓存。
## 4. 启动器的安全行为
1. 脚本按 `uname` 映射 Linux x64/arm64、macOS x64/arm64平台不在清单内时明确失败。
2. 下载先写入 `.part` 文件,下载完成后计算 SHA-256校验通过才原子改名为归档文件。
3. 已有缓存每次启动仍检查 SHA-256错误缓存只删除确定的单个归档路径不触碰仓库或用户目录。
4. 解压到 `.runtime/extract.*` 临时目录,确认 `bin/node` 存在且 `node --version` 精确等于 `v22.23.2` 后才移动到目标目录。
5. 运行时二进制和下载缓存不进入 Git升级必须同时更新版本、四个平台校验值、lockfile 和验证记录。
## 5. CI 与发布规则
- CI 不直接调用系统 `npm`,统一使用 `./npmw ci``./npmw run verify`
- CI 缓存键必须包含 Node 版本、操作系统、架构和 `package-lock.json` 哈希。
- 合并门禁先执行 `./nodew scripts/check-runtime.mjs`,再执行 Facade 边界检查、单元测试、构建和浏览器黄金测试。
- 发布产物必须记录 Node/npm、Vite、Three.js、Bitbybit OCCT、SQLite WASM 版本及 SHA-256禁止使用 `npm install` 生成未审计 lockfile。
- Node 升级是独立变更:先在 P0-RT-01 建立双版本矩阵,再更新 `.node-version` 与校验值,最后重新生成 lockfile 和 SBOM。
## 6. 故障处理
**仍出现 `EBADENGINE`**:检查命令是否以 `./npmw` 开头;检查 `./nodew --version`。直接执行系统 `npm``.npmrc``engine-strict=true` 下应失败,这是故意的防误用信号。
**下载失败**:确认能访问 `https://nodejs.org`,删除确定的 `.runtime/downloads/node-v22.23.2-*` 缓存后重新执行 `./npmw install`。不要手工替换归档或跳过校验。
**架构不支持**:在当前开发机使用 Linux x64新增平台时必须先把官方归档和 SHA-256 加入 `config/node-runtime.env`,并增加对应 CI job。
**依赖损坏**:执行 `./npmw ci` 重建 `node_modules`,不要用系统 Node 生成或修改 lockfile。
## 7. 验收证据
运行时修复的完成条件是:
- `./nodew --version``./npmw --version` 精确匹配固定值;
- `./npmw install``EBADENGINE`
- `./npmw run verify` 中的 `check:runtime`、Facade 边界、测试和生产构建全部通过;
- Vite/tsx 子进程的 `/proc/<pid>/exe`Linux指向 `.runtime/node-v22.23.2-*`
-`/usr/bin/node` 不被替换,且仓库工作区无 `.runtime` 未跟踪文件。