Files

124 lines
9.9 KiB
Markdown
Raw Permalink 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.
# Windows 便携包(零安装方案)
本文说明怎么打一份「目标机器什么都不用装」的 Windows 便携包,包里放了什么、没放什么,以及发出去之前要确认的授权。
相关代码:`scripts/make-windows-bundle.mjs`(打包)、`scripts/launch.mjs`(准备 + 起服务器 + 打开浏览器)。
## 1. 这份包解决什么
便携包只做一件事:**让这台 Windows 电脑当服务器**——包内自带 Node、素材与生产依赖,目标机器什么都不用装,
双击 `启动游戏.bat` 就在本机开服并自动打开浏览器,控制台会打印可以发给朋友的局域网地址
(自己玩、或和同宿舍/同办公室的朋友玩)。
**连别人的服务器不需要这个包**:直接用浏览器打开对方的网址就行,和你在浏览器里输网址是同一件事,
本机不用跑服务、不用下素材。包里因此没有「连接服务器」这个入口。
## 2. 打一份便携包
先准备素材(`public/assets`、`public/fonts`、`public/vendor` 都不进版本库):
```bash
node tools/setup.mjs
```
然后在仓库里(**任意平台**,只要有 Node 22+ 且能上网下载官方 Node 归档)执行:
```bash
node scripts/make-windows-bundle.mjs # 产物默认在 <仓库上一级>/Stronghold-Protocol-Windows
node scripts/make-windows-bundle.mjs --out D:\Game\Stronghold-Protocol-Windows --force
node scripts/make-windows-bundle.mjs --no-node # 目标机器已装 Node 22+ 时不必带便携 Node
node scripts/make-windows-bundle.mjs --node-version v22.23.3 --sha256 <64 位十六进制> # 换 Node 版本
```
`--out` 请给一个**专用目录**(像上面那样指到某个父目录下的子目录)。加 `--force` 时只会删掉两种情况:
目录是空的,或者里面就是上一次打的便携包(包根有 `README-开箱即用.md` 和 `app\`)。
其余情况一律拒绝并提示 —— 免得手滑把 `--out` 指到仓库、桌面或者其它有东西的目录上,`--force` 就把它们删了。
指向仓库本身或仓库的上级目录时更是在第一步就被挡下来。
产出的始终是 **Windows** 包(内含 win-x64 的 `node.exe`),但它**可以在 macOS / Linux 上打**:
官方归档解压出来的布局固定是 `<zip 名>/node.exe`,与打包机器是什么系统无关。
产物内容:
```
node\node.exe 官方 Windows x64 便携版 Node(版本与 sha256 钉在仓库里,只取 node.exe)
node\LICENSE-node.txt Node 自己的许可证(MIT,与 node.exe 出自同一个官方归档)
app\ 游戏本体:代码 + 生产依赖 + public(全部素材)+ data,完全离线
启动游戏.bat app\scripts\launch.mjs --no-setup
README-开箱即用.md 给玩家看的说明(含非官方 / 严禁盈利 / 素材版权声明)
LICENSE / NOTICE.md / THIRD-PARTY-NOTICES.md
```
把整个文件夹拷到目标电脑 —— **什么都不用安装**,双击 `启动游戏.bat` 即可(等于 `app\scripts\launch.mjs --no-setup`:
素材已经在包里,跳过联网准备,直接起服务器并打开浏览器)。
卸载=删除文件夹(不写注册表、不放系统目录)。素材约 330 MB 是硬成本,包因此比较大。
## 3. 包里放了什么、没放什么
`app\` 的文件清单来自 **`git ls-files`**,不是手写的跳过表。因此被 `.gitignore` 挡在版本库外的本机文件
(`.env`、`.venv*`、`.claude/`、`scripts/service.env.cmd` …)**天然进不了包** ——
它们里面可能有密钥或本机路径,旧实现用一张窄表整树复制,漏一项就是把它打进别人下载的压缩包。
在此之上额外放入三份不进版本库、但游戏必需的资源,以及用 `npm ci --omit=dev` **重新装好的生产依赖**:
* `public/assets`、`public/fonts`、`public/vendor`(由 `tools/setup.mjs` 下载 / 生成);
* `node_modules` 只含生产依赖 —— `puppeteer-core` 这类 devDependency 是开发测试用的,打进发行包只会白涨体积;
* `data/local-assets.json`(本机提取过 3D 棋盘贴图时才有):贴图本体在 `public/assets/local`(约 68 MB,会随
`public/assets` 进包),但游戏是靠这份 JSON 才知道有哪些贴图可用 —— 只带贴图不带清单,玩家拿到的是 68 MB
用不上的文件。清单不存在时会提示先跑 `node tools/setup.mjs --local`。
* `test/` 一律不进包(省体积)。
整树复制时会跳过符号链接与**点开头的条目**:打包机器的 `.DS_Store` 既不属于项目,也不该出现在别人下载的包里。
Node 版本与 sha256 **钉死在 `scripts/make-windows-bundle.mjs` 的 `NODE_PIN`** 里(不用 `latest-v22.x`):
那样今天打包和上个月打包内容不同,出了问题也无法复现。换版本必须显式给 `--node-version`(要写成 `vX.Y.Z` 这样的
具体版本)+ `--sha256`。
官方 zip 的下载缓存放在仓库的 **`.cache/`**(不进版本库),而 **`node.exe` 每次都从校验过的 zip 重新解压**:
解压目标是新建的临时目录、用完即删。缓存的是 zip,不是解压结果 —— 解压中断留下的残缺 `node.exe` 与校验过的
zip 没有任何对应关系,复用就等于把坏文件发出去;系统临时目录在 Linux 上还是共享的。
解压器按平台兜底:`tar`(Windows 10+ 与 macOS 自带的 bsdtar 都认得 zip)→ `unzip`(GNU tar 解不了 zip,
Linux 上是这一档)→ Windows 自带的 `Expand-Archive`。
关于 `--out` 与 `--force`:`--out` 指向**仓库本身或它的上级目录**时直接拒绝;即使指到别处,`--force` 也只会在
「目录是空的」或「里面就是上一次打的便携包(包根有 `README-开箱即用.md` 和 `app\`)」时才删除,
其它情况一律拒绝并不动那个目录 —— 路径比较挡不住大小写、符号链接、8.3 短名这些花样,所以规则是反着写的:
只有能确认「这就是上次的产物」才动手。
## 4. 授权(发出去之前请确认你同意)
便携包把整个游戏原样带给别人,所以包根会带上本项目的声明文件,包内 `README-开箱即用.md` 也完整重复了一遍:
> [!IMPORTANT]
> - 本项目是玩家自制的**非官方同人作品**,与上海鹰角网络科技有限公司(Hypergryph)、Yostar 及其关联方**没有任何关系**,未获其授权或认可。
> - 《明日方舟》及「卫戍协议」相关的名称、角色、美术、音乐、音效、文本与数据等素材,版权归原权利人所有。这些素材**不适用**本项目的 GPL-3.0 许可证;GPL 只覆盖本项目自己编写的代码。
> - 仅供学习交流与个人非商业使用。**严禁任何形式的盈利**,包括但不限于:售卖本项目或整合包、付费下载或付费分发、收费服务器或收费代开、广告 / 打赏 / 会员等变现方式,以及其他任何商业用途。
> - 本包为了方便玩家附带了游戏的美术与音频素材,下载即视为同意本声明。请勿将素材用于本项目以外的用途或**单独再分发**。完整条款见 [NOTICE.md](../NOTICE.md)。
> - 权利人如认为本项目侵犯其权益,请通过 Issue 联系,我们会**立即删除**相关内容。
> - 本项目按「现状」提供,**不提供任何担保**,使用风险自负。
内置 Node.js(MIT)与其它第三方组件的许可见 [THIRD-PARTY-NOTICES.md](../THIRD-PARTY-NOTICES.md) 与
`node\LICENSE-node.txt`(`node.exe` 自己的许可证,从同一个官方归档里取出来一起发)。
## 5. 常见问题
| 症状 | 处理 |
|---|---|
| 双击 `.bat` 一闪而过 | 在命令行里跑 `启动游戏.bat` 看报错,或手动运行 `node\node.exe app\scripts\launch.mjs --no-setup`(`.bat` 会在非 0 退出时暂停)。**`--no-setup` 别省**:省掉它会去联网准备素材,而且 PATH 上不一定有 `node` |
| 提示找不到 node | 便携包应含 `node\node.exe`;没有就用 `--no-node` 的包,并自行安装 Node 22/24 LTS |
| 端口被占用 | 关掉占用 3000 的程序(`node tools/doctor.mjs` 会指出是谁),或在启动命令后加 `--port 3001` |
| 浏览器没自动打开 | 手动访问 `http://127.0.0.1:<端口>`;`--no-open` / `SP_NO_BROWSER=1` 会禁用自动打开 |
| 朋友连不上 | 防火墙专用网络未放行、或不在同一网段;用 `node tools/doctor.mjs` 诊断(源仓库里见 [DEPLOY.md](DEPLOY.md) 的防火墙一节) |
| 进游戏时弹出「下载文件信息」 | 那是 IDM / 迅雷这类下载管理器在嗅探音频地址,不是游戏在下载。新版本已经改走不带扩展名的 `/media/…` 路由(见 [PR #28](https://github.com/sganggs/Stronghold-Protocol/pull/28)),**应该不会再弹**;如果还弹,把弹出的地址贴到 Issue,或在下载器里加例外(如 `http://127.0.0.1:3000/*`)、玩游戏时先退出它 |
| 首次进游戏很慢 | 每位玩家要下载几十 MB 素材(本机开服时是本机读盘),之后走浏览器缓存 |
| 在 Linux 上打包报解压失败 | GNU tar 不认 zip:装一个 `unzip`(或在文档允许的范围内改用 macOS / Windows 打包) |
## 6. 安全与体积说明
* 便携包里的 `node.exe` 来自 nodejs.org 官方发行版,**按仓库里钉死的 sha256 校验**后才复制,未做任何修改;
同时取出同一个归档里的 `LICENSE` 作为 `node\LICENSE-node.txt` 一起发出去。
* `app\` 里只有版本库跟踪的文件 + 生产依赖 + 素材 + 3D 棋盘清单,被 `.gitignore` 排除的本机文件
(`.env`、`.claude/`、`scripts/service.env.cmd` 等)不会进包。
* 游戏不写注册表、不装服务;`启动游戏.bat` 内容只有几行(切到 UTF-8 代码页 → 找 `node\node.exe` →
跑 `app\scripts\launch.mjs --no-setup`)。
* 想做成随开机启动的 Windows 服务,用仓库自带的 `scripts/install-service-windows.ps1`(面向整合包/源码部署,见 [DEPLOY.md](DEPLOY.md))。