怎么发布你的游戏
你需要:一个能在浏览器里离线运行的游戏(HTML + JavaScript),一个 npm 账号,一个 GitHub 账号,Node.js 22 以上。
整个过程分五步:建游戏包、放进游戏、检查、发布到 npm、提 Pull Request。
第一步:建游戏包
npx dsh-game-store init dsh-game-my-game
my-game 换成你的游戏名(小写字母、数字、连字符)。这条命令建出一个文件夹,里面是一个能直接上架的小游戏:
dsh-game-my-game/
├── package.json npm 包清单
├── game.json 游戏清单:名字、介绍、入口、图片
├── cordis.patch.yml 标准文件,保持原样
├── LICENSE 许可证
├── game/ 游戏本体
│ ├── index.html
│ └── game.js
└── store/ 商店里展示的内容
├── icon.png
├── cover.png
├── shot-1.png
├── about.en.md
└── about.zh.md
也可以直接复制 template 文件夹。
第二步:放进你的游戏
- 把游戏文件放进
game/,入口页是game/index.html。四件事要做到:
- 用到的脚本、字体、图片、声音都在game/里,用相对路径引用。商店里的游戏联不了网。
- 画面占满窗口,窗口大小变了跟着变,页面没有滚动条。商店启动游戏时会给它整个窗口并进入全屏。
- 存档用localStorage或IndexedDB。
- 游戏自己处理语言。可以读navigator.language,也可以在游戏里放语言选项。 - 改
game.json:id、名字、一句话介绍、作者、语言、操作方式、人数、内容分级。每个字段的写法见规范 2.4 节。 - 换掉
store/里的图片:
-icon.png:正方形,至少 128×128,最大 256 KB。
-cover.png:16:9,至少 1280×720,最大 2 MB。它是商店首页最大的那张图。
- 截图 1 到 8 张,每张至少 960×540,最大 2 MB。用真实的游戏画面。 - 写游戏说明
store/about.en.md和store/about.zh.md。英文必须有。用 Markdown 写:游戏是什么,有什么内容,怎么操作。 - 改
package.json:name、author、repository、license。再把LICENSE换成你选的许可证。 - 带手册的话,把手册做成一个 HTML 页面放进
manual/,在game.json里加"manual": { "zh": "manual/index.html" },并把"manual"加进package.json的files。
第三步:检查
npx dsh-game-store check dsh-game-my-game
它做的检查和商店的 CI 一样。有 error 就照提示改;warning 请看一眼。
想在 DSH 里实际试玩:
cd dsh-game-my-game
npm pack
dsh plugin --profile web add ./dsh-game-my-game-0.1.0.tgz
重启 DSH,游戏会出现在商店的“我的游戏”里,带一条“目录里没有它”的提示。试完用 dsh plugin --profile web remove dsh-game-my-game 移除。
第四步:发布到 npm
把游戏的源码推到 GitHub 上你自己的仓库,然后:
cd dsh-game-my-game
npm publish
npm 上同一个版本号只能发布一次。以后每次更新,先改 package.json 里的 version。
第五步:提 Pull Request
- 生成目录条目:
```bash npx dsh-game-store entry dsh-game-my-game@0.1.0 ```
它会打印出这样一段:
```json { "id": "my-game", "package": "dsh-game-my-game", "version": "0.1.0", "integrity": "sha512-…", "repository": "https://github.com/you/dsh-game-my-game", "addedAt": "2026-11-13" } ```
- Fork dsh-game-store 仓库,把这段存成
catalog/games/my-game.json。文件名就是游戏的id。 - 提 Pull Request。CI 会自动检查,结果显示在 Pull Request 页面上。
- 维护者会装上玩一下,按审核标准看一遍。有问题会在 Pull Request 里说。
- 合并以后,网站和目录自动更新。玩家的商店最晚一天后看到你的游戏。
更新游戏
- 改
package.json的version,npm publish。 - 运行
npx dsh-game-store entry dsh-game-my-game@<新版本>。 - 提 Pull Request,把
catalog/games/my-game.json里的version和integrity换成新的。addedAt保持原样。
合并以后,装过的玩家会看到“更新到 x.y.z”。
刚发布的 npm 版本,DSH 用的包管理器可能要等一天才肯安装。所以新版本合并当天,个别玩家点更新会失败,第二天就好。
下架
想下架自己的游戏,提 Pull Request 把条目改成:
{ "…": "…", "status": "delisted", "reason": "作者要求下架" }
或者在仓库里开一个 issue。下架规则见规范第 6 节。
常见的检查错误
| 提示 | 怎么改 |
|---|---|
cordis.patch.yml: must be the standard file | 从模板把这个文件原样复制过来 |
package.json dependencies: a game package has no dependencies | 把用到的库打包进 game/,删掉 dependencies |
package.json main: not allowed | 删掉 main、exports、bin |
game.json cover: … must be 16:9 | 把封面裁成 16:9,至少 1280×720 |
game.json name.en: English text is required | 多语言文字里补上 en |
network: … load from the internet | 把那些文件下载下来放进 game/,改成相对路径 |
integrity: the catalog says …, npm says … | 重新运行 npx dsh-game-store entry <包名>@<版本>,用它打印的值 |