# SimCAE 更新客户端 `update-client` 提供了 SimCAE 使用的受控启动和更新运行时。它是作为父 SimCAE 项目的一部分构建的,并不是一个独立的最终用户交付产品。 ## 发布不变量 * 每个受支持的发布版本构建都通过 `Launcher` 启动;直接启动应用程序必须被拒绝。 * 调试构建可能允许本地开发的直接启动,但它们绝不能打包给用户使用。 * 产品配置在配置时选择并嵌入到二进制文件中。安装的 `app_config.json` 不是支持的配置机制。 * 可变的机器状态与产品策略分开保存,并不是授权的来源。 * 由服务器签名的策略、清单、设备凭证以及更新负载验证始终保持权威性。 * 用户可见的源文本是英文。其他语言仅通过本地化资源提供。 * 父级 `package_installer` 目标是唯一支持的最终用户包路径。 `package_installer_qt` 已归档且不被支持。 ## 运行时组件 | 组件 | 责任 | | --- | --- | | 启动器 | 验证启动策略、设备状态和已安装文件;检查更新;创建一次性启动凭证。 | | 更新器 | 下载并验证更改的文件,管理更新事务,需要时请求引导替换,并提交或回滚。 | | Bootstrap | 替换在更新过程中无法更新的文件,然后继续事务。 | | 主应用 | 集成示例用于启动票的消费和更新健康报告。SimCAE 在其可执行文件中实现了相同的契约。 | | 公共 | 共享产品配置、状态、HTTP、身份、策略、完整性以及票务支持。 | ## 支持的流程 从父级 SimCAE 仓库中进行配置、构建、测试和打包。正常的发布流程是: ```powershell git submodule update --init --recursive cmake --preset SimCAE-release cmake --build --preset SimCAE-release --target SimCAE ctest --test-dir out/build/SimCAE-release -C Release --output-on-failure cmake --build --preset SimCAE-release --target package_installer ``` 不要使用已移除的 PowerShell SDK/客户端打包脚本。它们绕过了父安装规则,且不再代表交付的产品。 请参见 [构建和打包](docs/build-and-packaging.md) 了解前提条件、独立开发者构建、包检查和输出所有权信息。 ## 配置 配置时的源文件选择顺序如下: 1. `config/config.json`,如果存在的话。 2. `config/app_config.example.json`,否则。 所选数据将被验证并嵌入。源文件不会被复制到安装目录中。安装目录中名为 `app_config.json` 或 `client.ini` 的文件仅为遗留输入,不得覆盖嵌入的策略。 查看 [配置和安全](docs/configuration-and-security.md) 和 [旧配置迁移](docs/legacy-configuration-migration.md) 。 ## 文档说明 * [架构](docs/architecture.md) * [构建和打包](docs/build-and-packaging.md) * [配置和安全](docs/configuration-and-security.md) * [本地化维护](docs/i18n.md) * [旧配置迁移](docs/legacy-configuration-migration.md) ## 仓库规则 * 保持生产环境的 C、C++和 CMake 文件中不含汉字。添加或更新本地化 UI 文本的翻译资源。 * 通过 CMake 导入目标链接 Qt、OpenSSL 和其他依赖项。绝不要将开发机器的路径添加到仓库中。 * 将发布打包保留在父项目中。此子项目可能会暴露目标和安装规则,但不会生成竞争的安装程序。 * 不要将嵌入资源、本地设置或客户端令牌视为可以抵御机器管理员的机密信息。 * 没有可用启动器/更新运行时的平台必须导致发布配置或打包失败。它不得回退到直接启动。 ## 仓库布局 ```text Bootstrap/ 更新交接可执行文件 Common/ 共享运行时服务 Launcher/ 必要的产品入口点 MainApp/ 集成示例 Updater/ 事务性更新可执行文件 config/ 配置时模板和公共验证材料 docs/ 保持的架构和操作文档 ```