Files
core/.trellis/tasks/09-28-shared-toolchain/prd.md
T

6.2 KiB

Dever 本机共享工具链

Goal

让一台机器上的所有用户和所有 Dever 项目始终使用同一个全局 dever 命令。Dever 内部负责安装、升级、版本选择、项目锁定、安全共享缓存和清理;用户不需要理解或指定编译器真实路径。

Background

  • deverc check/run/build <project-root> 已经可以处理任意项目根目录,但当前只是开发仓库中的单个引导编译器。
  • 当前没有正式的全局 dever 入口、机器级安装目录、版本选择、项目锁定、升级回滚或卸载合同。
  • 当前 compile、compile_application、compile_project 和 compile_test_suite 把默认缓存固定到编译器源码工作区的 target/native-artifacts,不能作为多用户机器级缓存。
  • 现有缓存键已经包含编译器、后端工具、runtime、生成内容、平台和编译选项,并且发布过程具有完整性校验和并发原子性。
  • 项目配置只读取各项目自己的 config/setting.json;工具链选择也必须遵守这一配置边界,不增加环境变量或第二个项目配置文件。

Requirements

Global Command

  • 每台机器只公开一个 dever 命令;普通用户和所有项目都调用这个入口。
  • 全局入口不得要求用户设置 PATH 之外的 Dever 环境变量,也不得要求用户知道内部版本目录。
  • check/api/fmt/test/run/build/tenant 等现有命令参数保持项目根合同,入口只负责选择工具链后原样分派。

Installation And Versions

  • 提供 dever install <version|latest>、dever update、dever use <version> 和 dever uninstall <version>。
  • 初次安装、版本安装、切换和卸载按操作系统要求获取管理员权限;日常项目命令不需要管理员权限。
  • 多个版本安装在机器级版本目录,安装与切换使用 staging + atomic rename,失败时保留当前可用版本。
  • 下载的发行物必须校验受信签名和内容摘要;不得执行未验证的编译器。
  • dever update 安装并切换到新版本;失败或健康检查不通过时自动保留旧版本。
  • 卸载当前默认版本必须先切换到其它版本;项目锁定了已卸载版本时给出明确的安装命令,不静默改用其它版本。

Project Selection

  • 项目可以在 config/setting.json 中可选声明 dever.version。
  • 已锁定项目精确选择该版本;未锁定项目使用机器默认版本。
  • 版本缺失、格式非法或不受支持时在读取项目源码和运行项目程序前失败。
  • 版本选择不读取环境变量,不新增 .dever-version、lock 文件或用户级配置。

Machine Sharing And Isolation

  • 所有操作系统用户共享同一个全局入口、已安装版本、标准库、runtime/target packs 和机器级缓存服务。
  • 每个项目的源码、config/setting.json、data/、构建输出、端口和运行进程保持独立,不复制到工具链目录。
  • 普通用户不能直接修改全局入口、已安装版本、默认版本状态或缓存条目。
  • 跨用户缓存不得让一个用户写入随后由另一个用户直接执行的未验证文件,也不得提供按目录浏览其他项目产物的能力。

Shared Cache

  • 共享缓存由机器级 Dever 缓存/编译服务独占写入;客户端只提交完整构建输入并接收验证后的结果。
  • 缓存键改为密码学内容摘要,并继续覆盖编译器版本、runtime、目标平台、生成内容和编译选项。
  • 相同版本和相同完整输入可以跨项目、跨用户复用;不同输入、版本或目标不得复用。
  • 缓存发布保持不可变、完整性校验和并发原子性;普通用户不能伪造缓存命中。
  • 提供 dever cache status 和 dever cache clean;更新或卸载后自动清理没有引用的临时文件和损坏条目。
  • 缓存服务不可用时明确失败,不退回不受保护的全局可写目录;是否允许本次不使用共享缓存必须是显式 CLI 选项,而不是隐藏回退。

Acceptance Criteria

  • 安装后,机器上的两个不同系统用户都通过同一路径的 dever 命令运行各自项目,无需用户级 Dever 安装。
  • 未锁定项目自动使用机器默认版本;config/setting.json 锁定版本的项目自动使用对应已安装版本。
  • 安装、升级、切换和卸载具有原子性;故障注入后旧的可用版本和全局入口不受损。
  • 签名错误、摘要错误、版本缺失和卸载当前版本均返回明确错误,不执行错误版本。
  • 两个项目或用户产生相同完整原生输入时命中同一缓存;输入、版本或目标改变时不会错误复用。
  • 非特权用户无法修改版本、默认状态或伪造缓存条目供其他用户执行。
  • 项目源码、配置、运行数据和显式构建输出不会进入共享安装目录或被其他用户通过 Dever 浏览。
  • dever cache status/clean 可检查和清理共享缓存;并发构建与清理不会暴露半成品或删除正在使用的条目。
  • 所有选择和运行行为不读取 HOME、XDG_*、DEVER_*、RUSTC 或其它 Dever 配置环境变量。
  • Linux、macOS 和 Windows 分别验证全局入口、系统权限、版本分派和升级回滚;实际支持平台必须与父发行任务一致。

Out Of Scope

  • 修改 .dever 语言语法或应用业务目录规范。
  • 将项目运行配置移出 config/setting.json。
  • 云端编译、上传源码或依赖远程构建服务。
  • 在本任务重复实现父任务负责的 LLVM/LLD 后端和六目标交叉编译器;本任务消费父任务交付的可安装发行物。
  • 承诺不同源码产生的程序可以共享缓存;共享仅发生在完整输入一致时。

Key Decisions

  • “简单”指用户只面对一个 dever 命令和项目现有的 config/setting.json,不是减少产品功能。
  • 全局入口与真实编译器版本分离:入口稳定,版本可以并存、切换和回滚。
  • dever.version 是唯一项目级工具链选择;机器默认版本是唯一未锁定项目选择,不存在更多优先级。
  • 跨用户写共享可执行缓存是安全边界,因此由机器服务持有,不能使用所有用户可写目录代替。