我已经将内容翻译为简体中文:
这篇文章没有链接,子版块的规则会吃掉它们。 如果你有问题,可以在评论中提问,我会回答。
我一直在努力将Xash3D-FWGS的开源金源引擎移植到WebAssembly。 它可以在浏览器标签中运行CS 1.6和半条命死亡赛,客户端和独立服务器都可以。 有个人我从未见过,建立了一个基于它的前端,叫做WebXash,保存管理器,文件夹和压缩包加载,WebSocket多人在线,所有这些都是我在npm上发布的包。
这篇文章是关于发布工具来让类似的项目持续运行。
仓库
引擎编译到WASM通过Emscripten,发布到npm。 引擎再次与CGO WebRTC 层一起发布到浏览器上线。 半条命游戏逻辑。 CS 1.6客户端在那些基础上。 一个带有可玩CS服务器和Web客户端的docker镜像。 另一个镜像与CS内容被去掉,半条命默认设置代替,且带有MetaMod-P/AMX Mod X的变体。
C,javascript,typescript,go,docker。 每一个都有一个版本,每一个都依赖于仓库中的另一个包。
排序
你不能在客户端发布之前发布引擎。 okay,所有工具都有一个图表。 但是半条命镜像从
FROM cs-web-server:1.4.2
开始,所以它不能开始构建,直到CS镜像被推送。 不是构建,是推送。 go模块是同样的形状,提交标签必须存在,才能要求它。
所有我尝试过的单仓库工具都会构建所有包,然后发布所有包。 lerna,changesets,nx,turborepo。 这是npm的正确做法,一个包在本地工作区中构建之前,才会发布。 但是docker镜像的基座来自一个注册表。 我总是不得不自己管理这个图表,推送CS镜像,等待,然后手动发布(因为HLDs有CS和HL的文件夹和WASM,为了HL,我只想去掉CS文件,替换CS的WASM为HL的WASM)。
我想这个规则是包的属性,而不是工具的属性。 npm消费者可以早早构建,docker消费者不能,然而我找不到任何工具来做出区分。
然后有件事发生了。当它出错时。 我添加了MetaMod支持,所以有四个镜像(CS/HLS/vanilla/MetaMod+AMX)有自定义的依赖图,另外我还想创建带有预装好的模组的镜像,例如僵尸模组。 想象一下,如果CS基座中的某个bug出现了,或者某个构建/发布失败了,重新发布整个图表。
所以我写了Dispat
单个二进制文件,MIT许可证,没有守护进程,没有状态文件,什么也没有主机。 两个想法。
消费者是否等待构建还是发布是设置的。 isBuildWaitingPublish在空间中。 npm空间关闭,消费者可以早早构建,docker空间打开,消费者构建不会开始,直到它的提供者的docker push返回。 我的四级链程程自己调度,未相关的分支仍然可以并行。
记录某个包发布成功的标志是注释的git标签,写入发布成功后。 没有状态来恢复,没有注册表来询问。 计划是一个纯函数,依赖于你的历史,图表和配置。 重跑计算相同的计划,执行没有标签的部分。 失败的半条命镜像在下一次运行时被恢复,版本与它最初应该有的版本相同,已经发布的三个npm包简单地不在计划中。
它做什么
- 只测试diff落地的位置。
dispat run test --since origin/main运行脚本,访问那些提交的包,包括依赖项,依赖顺序。dispat if --changed在相同的问题上分支一个CI步骤。 - steam。 steamcmd和SteamPipe vdf模板,版本写入构建描述中,
$DISPAT_CHANNEL选择哪个分支发布,一个标记为%beta的提交会发布到你的beta分支,稳定发布会发布到默认分支。 同时写入更改日志,git标签和github发布。 - itch。
butler push --userversion $DISPAT_NEW_VERSION。 - 引擎版本文件,读取并在原处重写,格式保持不变。 unity的ProjectSettings.asset和Packages/manifest.json,godot的project.godot,plugin.cfg和export_presets.cfg,unreal的.uplugin和DefaultGame.ini。 ios的Info.plist和project.pbxproj,android的AndroidManifest和gradle版本目录。
- 包是一个文件夹,阶段是一个shell命令,唯一的原因是C,go,typescript和docker都在一个图表中。 它不是一个项目的形状。 游戏加服务器加启动器加两个库,或者一个游戏自己。
- 多仓库,不仅仅是单仓库。 一个小的控制仓库持有配置,并将每个真实仓库作为git子模块。 移动一个指针是提交,修改该包的文件夹,版本,日志,标签和传播,跨仓库,依赖顺序。 不需要在这些仓库中工作的人学习Dispat或改变他们的提交方式。
- 图表可以来自你的清单。
dispat compute读取package.json,go.mod,Cargo.toml,pyproject,dockerfiles和compose文件,计算提供者和消费者,FROM链包括在内。--check检查是否漂移,失败时终止CI。 autoVersion写入计算版本到清单中,syncLock在构建前重新生成锁文件。- 传播是每次提交。
feat(engine)^^:访问所有依赖的消费者,+2访问两个边,fix(*,-app):访问除了一个包之外的所有内容,%beta将某个包移动到预发布线上。 - 如果你的堆栈宽于一个游戏,超过35种清单格式,20个生态系统。
dispat preview在任何东西运行之前打印发布说明。
它做得不好
- 需要传统的提交。 版本必须来自哪里。
- 不会构建任何东西。 Emscripten,docker,go build,所有这些仍然是你的命令。 它运行它们并停止,如果它们失败。
- 没有缓存,并且不是一个任务运行器。 它计算git中改变了什么,跳过其他内容,任何你已经缓存的内容仍然在你的构建步骤中工作。
- 在多仓库设置中,版本和日志在控制仓库中,而不是在链接仓库中。 这是一个真正的权衡,某些团队会讨厌它。
任何这一切都重要的原因是,有个人建立了WebXash基于这些npm包,然而没有人可以在版本号是谎言时构建。 我们的确是,好一段时间,直到我手动将它们更新为止。
现在发布日是dispat,就是它了。 它也发布自己,1.0.0是11个包,CLI有6个跨编译二进制文件,5个go模块,4个容器镜像和文档站点,各自有自己的,测试只在最后一次提交的包中运行(完整套餐在发布前)
版本,标签,日志和发布。
如果你想详细了解Emscripten或发布,很高兴回答。 再次,提问任何链接,我会在回复中发布。
评论 (0)