Skip to content

Research: 借鉴 mjlab,规划 UniLab PyPI package 发布路径 #1326

Description

@TATP-233

Parent roadmap: #1252(候选项 7 的扩展)
Related: #360(已关闭;当前安装文档仍记录同一缺口)
Work type: research
Area: CI/tooling

一句话问题

UniLab 的 pyproject.toml 已声明 uv_build0.1.0 元数据和 console scripts,但 package 产物、仓外可运行的 CLI、资产/依赖边界及 PyPI 发布流程尚未闭环。

为什么现在做

  • src/unilab/cli.py:40-57 明确要求源码 checkout 同时存在 conf/scripts/;二者位于仓库顶层,clean wheel/sdist 不包含它们。安装文档也明确说明 pip/wheel 尚不支持仓外训练(EN中文)。
  • origin/main@34880c7a 做 clean archive 后运行 uv build:wheel 55,860,217 bytes、sdist 55,738,839 bytes;wheel 含 279 个 asset member(未压缩约 140 MiB),但没有 conf//scripts/src/unilab/__init__.py:5 仍为 0.0.0,与 pyproject.toml0.1.0 不一致;当前 uv 0.12.5 还会提示 build-system 上限 <0.12
  • PyPI 上已经存在 unilab==0.0.0 占位项目(项目页),发布前必须确认项目所有权、2FA 和 Trusted Publisher 配置。
  • UniLab 当前没有 mjlab 所具备的 RELEASING.mdmake build/publish-test/publish、tag 触发的 release workflow 或 wheel/sdist 安装冒烟 job;现有 CI 只验证源码 checkout。
  • mjlab v1.6.0 是可复用的发布先例:运行脚本、任务配置和必要 XML 都在 src/mjlab 包内;使用 uv_build 和完整 PyPI metadata/extras;Makefile 提供 build/TestPyPI/发布目标;RELEASING.md 固化版本、annotated tag 和发布后验证;release.ymlv* tag、PyPI OIDC、wheel+sdist isolated smoke 后再 publish;PyPI 产物约 14 MB,可用 uvx --from mjlab demo 验证。UniLab 仍须保留 Hydra、多后端和 owner-config contract,不能直接照搬 mjlab 的单后端布局。

最小交付结果

只产出一份 maintainer 可决策的发布分析和一个后续 child issue 草案,不改代码、不改配置、不改 CI、不上传包。推荐把“单一 unilab wheel/sdist、明确支持的 CLI 子集、package-owned 配置/脚本、backend extras、动态资产使用用户可写缓存”作为最小方案基线,同时说明 library-only 与拆分 package 的真实成本;最终支持面由 maintainer 确认。

In scope

  • 审计 wheel/sdist 的文件清单、版本来源、console scripts,以及 cli.pydemo.py、HORA/多卡路径中的源码根目录假设。
  • 对照 mjlab v1.6.0 的 package layout、metadata、extras、build/release workflow 和 artifact smoke,标出可借鉴与不适用部分。
  • 比较最多三个发布面选项(library-only、仓外可运行的 self-contained CLI、拆分 core/backend/assets),给出用户价值、规模和长期维护成本。
  • 盘点 Hydra 配置、MuJoCo/MJWarp/Motrix extras、PyTorch 私有 index、mujoco-uni-runtime 原生构建、资产体积/许可证、PyPI 名称所有权等阻塞项。
  • 写出 wheel/sdist、干净环境、仓外命令和 optional backend 的最小验证矩阵,并拆出一个独立 implementation issue(含文件/LOC/PR 预算)。

Non-goals

Owner 与预计改动

Owner layer 为 package/release boundary + CI/tooling;建议 owner @TATP-233(待 maintainer 确认)。本 issue 预计 0 个文件、0 行代码、0 个 PR;后续实现必须另立并单独确认的 child issue。

Acceptance criteria

  • issue comment 或附录记录可复现的 clean-tree build 命令、artifact manifest/size、缺失的 conf/scripts 和版本不一致事实。
  • 给出 UniLab 与 mjlab 的对照表,并明确哪些机制采用、哪些因 Hydra/多后端/资产约束拒绝。
  • 明确首个发布版本支持的安装方式、命令、extras、平台和“不支持”边界。
  • 对 PyPI 名称/权限、依赖索引与原生构建、资产许可证/缓存位置给出结论或责任人;未解决项有 stop condition。
  • 产出一个可独立 review 的 implementation child 草案,声明文件数、净手写 LOC、PR 数和近风险验证;本 issue 全程无代码/发布副作用。

Stop conditions

  • maintainer 尚未在 library-only 与仓外可运行 CLI 之间做出选择时,暂停,不进入实现。
  • 资产再分发权、包大小/缓存写入策略或 optional dependency 的平台可用性无法确认时,拆分或回到决策。
  • 需要新增公共 contract、execution path、runner/lifecycle 或长期 CI/support claim 时,另立 issue 并重新确认。
  • unilab 项目所有权或 Trusted Publisher 未确认时,不执行任何发布动作。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions