Skip to content

feat: beta/stable 双渠道构建重构(monorepo + variants + 入口 barrel) - #3

Open
XiaoYangx666 wants to merge 8 commits into
devfrom
feat/dual-channel-entries
Open

feat: beta/stable 双渠道构建重构(monorepo + variants + 入口 barrel)#3
XiaoYangx666 wants to merge 8 commits into
devfrom
feat/dual-channel-entries

Conversation

@XiaoYangx666

Copy link
Copy Markdown
Owner

概述

不维护双分支,用单一共享源码同时构建并发布 sapi-pro 的 beta / stable 双渠道。beta 与 stable 各有独立的
package.json、Rolldown 配置与 @minecraft/* 依赖版本,同一份 packages/core/src 构建成不同的 dist

改动内容

1. 迁移为 monorepo

  • 共享源码与测试迁到 packages/core/src/ + test/,不发布)
  • package.json 只做脚本编排与测试依赖

2. 双渠道构建(variants/beta + variants/stable

  • 每渠道独立 rolldown.config.tstransform.define 注入 __BETA__(beta=true /
    stable=false)实现条件编译 + 死代码消除
  • 版本注入:__SAPI_PRO_VERSION__(显示字符串)与
    __SAPI_PRO_VERSION_NUM__(多包主机选举数字),从各自渠道的 package.json 读取
  • 每渠道独立 tsconfig,@minecraft/server@minecraft/server-ui 重定向到各自安装的版本(beta 用最新 beta
    版、stable 用稳定版)
  • stable 渠道剔除模拟命令子系统(parser / help / func)与 chatBus,产物不含对应 .js / .d.ts;stable
    只注册游戏原生命令

3. chatBus 改为渠道入口 barrel 隔离

  • chatBus 实例归入共享 Event/chatBus.ts,只由每渠道入口 barrel(entry.beta.ts /
    entry.stable.tsEvent.entry.*.ts)决定是否导出
  • beta 的 d.ts 暴露 chatBus(免空检查);stable 的 d.ts 不导出(消费方 import { chatBus } 报 TS2305)

4. 发布流程

  • beta 渠道 → npm publish --tag beta
  • stable 渠道 → npm publish --tag stable
  • 两渠道均不挂 latest 标签,安装用 sapi-pro@beta / sapi-pro@stable 显式指定
  • CI:build.yml(dev push / PR / 手动)+ release.ymlv* 标签 / 手动,发布 npm + GitHub Release)

验证

  • npm run typecheck:beta / typecheck:stable 双渠道类型检查通过
  • npm test 98 个用例全部通过
  • ✅ 双渠道 rolldown 构建 + fflate 打包通过
  • ✅ 下游消费者 tsc 冒烟:beta 可 import { chatBus },stable 报 TS2305
  • ✅ tgz 产物核对:beta 含 Event/chatBus;stable 无 chatBus / parser / help,保留共享 chatBusClass 类型

注意事项

  • 依赖安装:根 npm install 后需 npm run install:variants(两个渠道各自安装 @minecraft/*
  • 发布前需在仓库 Secrets 配置 NPM_TOKEN(未配置时发布步骤自动跳过)
  • stable 版依赖 stable ScriptAPI(@minecraft/server@2.8.0),不支持成就无关的 beta-only 功能

XiaoYangx666 and others added 8 commits July 31, 2026 20:12
Co-Authored-By: Claude <noreply@anthropic.com>
- 常用命令、架构总览
- 构建链路约束:rolldown 多入口、dts entry、版本注入双 config 同步、
  @minecraft 钉版、legacy-peer-deps、typescript@7 无编译器 API、export type
- 开发规则:以实际类型定义为准、文本符号/颜色约束、版本线一致

Co-Authored-By: Claude <noreply@anthropic.com>
共享实现与测试集中到 packages/core/src 与 packages/core/test(不发布),
根目录仅保留编排脚本与测试依赖,删除根 rolldown.config.ts。

Co-Authored-By: Claude <noreply@anthropic.com>
同一份 packages/core/src 用两个渠道的 rolldown 配置构建:
- __BETA__ 构建期注入实现条件编译(beta=true / stable=false)
- 各渠道用各自 package.json 版本注入 __SAPI_PRO_VERSION_* / 选举数字
- 每渠道独立 tsconfig,@minecraft/* 重定向到各自安装的类型版本
- stable 经 treeshake.moduleSideEffects + dts glob 排除模拟命令子系统
- 发布:beta --tag beta / stable --tag stable,均不挂 latest

Co-Authored-By: Claude <noreply@anthropic.com>
移除 per-channel 源码(variants/*/chatBus.ts、commandWiring.ts)与 @sapi/* 别名:
- chatBus 实例归入共享 Event/chatBus.ts,Event.ts 不再导出实例
- 每渠道入口 barrel(entry.<ch>.ts / Event.entry.<ch>.ts)决定是否暴露 chatBus
- beta 的 d.ts 暴露 chatBus(免空检查),stable 的 d.ts 无 chatBus(导入报 TS2305)
- 模拟命令聊天接线内联为 if (__BETA__) chatBus.subscribe(...)
- stable 产物经 treeshake.moduleSideEffects + dts glob 剔除 chatBus 模块
- dist 结构回到干净路径(preserveModulesRoot = CORE)

Co-Authored-By: Claude <noreply@anthropic.com>
GitHub Actions 的 secrets 上下文仅允许在 job 级 if 与 env 中使用,
step 级 if 引用会报 Unrecognized named-value。改为先经 env 读出
NPM_TOKEN 是否配置并写入 step output,发布步骤用 steps.<id>.outputs 判断。

Co-Authored-By: Claude <noreply@anthropic.com>
根 pack 脚本此前只是 build 的别名(只产出 build/*.zip),
CI 的 *.tgz 上传/Release 附件因此匹配不到文件。改为
build 后追加 pack:beta + pack:stable,产出两个 .tgz。

Co-Authored-By: Claude <noreply@anthropic.com>
根 devDependencies 不再安装 @minecraft/common/server/server-ui:
- 构建链路本就各自用 tsconfig.beta/stable.json 的 paths 重定向到渠道 node_modules
- vitest 测试用工厂 mock 不加载真实模块(98 用例通过)
- 编辑器类型经根 tsconfig.json 新增的 @minecraft paths 指向 variants/beta 的 beta 类型

Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant