ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Loco 的 xtask 开发辅助工具:一条命令完成全量测试与版本发布

Loco 的 xtask 开发辅助工具:一条命令完成全量测试与版本发布 Loco 的 xtask 开发辅助工具一条命令完成全量测试与版本发布【免费下载链接】loco The one-person framework for Rust for side-projects and startups项目地址: https://gitcode.com/GitHub_Trending/lo/locoLoco 仓库内部维护着一个名为xtask的工作区成员包它承担着 Loco 框架自身的开发辅助职责用一条命令跑完整个仓库的测试矩阵、为一次新版本发布做全链路准备。本文以 xtask/README.md 为主体结合 xtask 源码 与 DEVELOPMENT.md 中的发布流程深入拆解 xtask 的子命令设计、bump-version的内部实现细节以及一次 Loco 版本发布从分支创建到合入 main 的完整操作流程。xtask 是什么Loco 维护者的开发辅助工具xtask是 Rust 生态中常见的工程化实践——把仓库级任务测试、lint、版本发布封装成一个独立的 cargo 包避免在 shell 脚本中维护脆弱的多命令串联逻辑。Loco 对其定位非常直白The Loco xtask serves as a loco development helper, streamlining various tasks on the library, such as running all tests with a single command and preparing for a new release and maybe more.从仓库结构看xtask是根 Cargo.toml 中 workspace 的正式成员members [xtask, loco-gen]其依赖xtask/Cargo.toml包括clap命令行解析、duct子进程编排、cargo_metadata读取包元数据、requestty交互确认、regex文本替换、tabled表格化 CI 结果输出等完全是为跑命令、改文件、看结果而生的工具链。仓库还通过 .cargo/config.toml 注册了别名[alias] xtask run --package xtask --这使得维护者可以在仓库根目录直接使用cargo xtask ...调用而 README 中则演示了进入xtask目录后使用cargo run ...的等价方式。三个子命令test、bump-version 与 bumpxtask 的 CLI 入口定义在 xtask/src/bin/main.rs通过clap派生宏声明了三个子命令子命令作用关键参数test对 Loco 所有资源库、examples、loco-new 等运行 CI 检查--quick只测 Loco 库本身bump-version升级版本号并更新所有 starters 依赖、验证 starters CI--exclude-starters跳过 starters 环节bump较新的版本升级入口同步升级 loco-new 并打印发布清单无main函数会先打印当前工作目录running in: {project_dir:?}随后根据子命令分发执行bump-version与bump在执行前都会通过cargo_metadata读取根包当前版本并调用 prompt.rs 中的confirmation弹出交互式确认例如upgrading loco version from 0.16.4 to 0.17.0只有用户确认后才真正动手修改文件。test一条命令跑完全部测试cargo xtask test等价于进入xtask目录执行cargo run test会触发 ci.rs 中的all_resources依次对 Loco 主库、examples目录下的所有示例、以及loco-new运行完整的 CI 流水线。每个资源执行三项检查见 ci.rscargo test --all-features --all全 feature、全 target 测试cargo fmt --all格式检查cargo clippy -- -W clippy::pedantic -W rust-2021-compatibility -W rust-2018-idioms带 pedantic 级别的 lint结果以 RunResults 结构收集path/fmt/clippy/test 四项并通过 out.rs 用tabled渲染成一张表格输出到终端is_valid()要求 fmt、clippy、test 三项全部通过才算该资源合格。传入--quick时只对主库执行一次run用于快速本地验证。根据 DEVELOPMENT.md运行全部测试前需要满足两个前置条件本地redis处于运行状态且starters/saas/frontend前端包已构建pnpm i pnpm build。bump-version一次发布的前置引擎README 给出了bump-version的入口命令cd xtask cargo run bump-version VERSION在仓库根目录则等价于cargo xtask bump-version VERSIONVERSION 形如0.1.3不带v前缀。执行的三步核心动作按照 README 的描述bump-version依次完成更新 Loco 库在 Cargo.toml 中的版本号把所有 starters 的loco-rs依赖替换为../../loco-rs本地路径使它们针对即将发布的目标版本运行 CI 测试若 CI 失败则中止操作把所有 starters 锁定回指定 Loco 版本。这三步在源码 bump_version.rs 的BumpVersion::run中有完整对应pub fn run(self) - Result() { self.bump_loco_framework(.)?; self.bump_loco_framework(loco-gen)?; self.bump_subcrates_version([loco-gen])?; if self.bump_starters { self.modify_starters_loco_version(loco-rs { path \../../\)?; println!(Testing starters CI); let starter_projects: Vecci::RunResults ci::run_all_in_folder(self.base_dir.join(utils::FOLDER_STARTERS))?; // 检查每个 starter 是否通过 CI未通过则返回错误终止 self.modify_starters_loco_version(format!( loco-rs {{ version \{}\, self.version))?; } Ok(()) }版本替换的底层实现bump_loco_frameworkbump_version.rs分别读取根目录与loco-gen/下的Cargo.toml用预编译的正则REPLACE_LOCO_LIB_VERSION_匹配name ...后紧跟的version x.y.z字段并替换为新版本。若文件中匹配不到该模式则返回Error::BumpVersion见 errors.rs错误信息会明确指出在哪个路径下找不到哪个包。bump_subcrates_versionbump_version.rs处理根Cargo.toml中对子 crate 的依赖声明例如当前根 Cargo.toml 中的loco-gen { version 0.16.1, path ./loco-gen }它会将版本号整体替换为loco-gen { version 新版本, path ./loco-gen }保持结构不变。starters 的版本替换由modify_starters_loco_version/replace_loco_rs_versionbump_version.rs完成通过 utils.rs 的get_cargo_folders扫描starters目录下所有含Cargo.toml的子项目用正则loco-rs { (version|path) [^]全局替换 loco-rs 依赖行。这也印证了 README 中先指向本地路径做 CI、成功后锁定版本的两段式设计——它确保 starters 始终与目标发布版本保持一致而不是停留在仓库里某个旧版本上。一个可选参数--exclude-starters从 main.rs 看bump-version支持--exclude-startersaction SetFalse默认启用 starters 流程。传入该参数可跳过修改 starters 依赖并运行 starters CI这一耗时环节适用于只想快速升级版本号的场景。默认行为不传参则会执行完整的 starters 更新与 CI 验证。版本发布完整步骤Release StepsREADME 给出了从本地到发布的完整操作序列这也是 Loco 维护者每次发版的标准动作创建发布分支git checkout -b bump-version-[VERSION]运行脚本更新所有相关资源cd xtask cargo run bump-version VERSION这一步会执行前文所述的三步动作若 starters CI 失败命令会报错终止此时应先修复问题再以相同版本号重新执行这是 DEVELOPMENT.md 中特别强调的约定因为此时 starters 已被改指向本地路径尚未正式锁定。推送分支并等待 CI 通过把包含版本变更的分支推送到远端让仓库 CI 在更多配置组合下验证目标版本此时 starters 的 CI 因为已经指向本地../../loco-rs会直接针对本次待发布代码运行。发布新 crateCI 通过后执行cargo publish将新版本推送到 crates.io。注意这一步要求本地先提交版本变更starters 此时已指向下一版本因此在发布完成前不要推送。合并到 main发布成功后将分支合入主分支并等待最终 CI尤其是拉取了新版本的 starters CI全部通过。bump新一代的版本升级入口除了 README 主推的bump-version当前 CLI 还保留了bump子命令其实现位于 versions.rs 的bump_version函数。它代表了更完整的发布准备流程对loco-new依次运行cargo fmt与cargo clippy若环境变量LOCO_DEV_MODE_PATH未设置则将当前仓库路径写入该变量并把CARGO_SHARED_PATH指向/tmp/cargo-shared-path以共享编译产物、加速 starters 编译源码注释称this should accelerate starters compilation在loco-new目录运行cargo test -- --test-threads 1单线程测试同步版本号根 Cargo.toml 的version字段、loco-gen/Cargo.toml 的version字段、根Cargo.toml中loco-gen依赖的版本、以及 loco-new/src/lib.rs 中的pub const LOCO_VERSION: str常量源码注释示例为0.13最后打印一份发布清单明确后续要依次执行的发布动作PUBLISHING framework $ cd loco-gen cargo publish $ cargo publish loco new CLI $ cd loco-new cargo-publish docs $ cd docs-site $ npm build $ zola build netlify deploy -p -d public这份输出展示了 Loco 发布实际上涉及三个可发布物——框架本体loco-rs与其子 crateloco-gen、脚手架 CLIloco-new以及文档站点体现出 xtask 作为发布编排者的完整职责。工程化启示xtask 的可维护性设计回看 xtask 的实现有几处设计值得借鉴单一入口、子命令扩展所有任务收敛在 main.rs 的Commands枚举中新增任务只需增加一个变体通过.cargo/config.toml别名屏蔽--package xtask的细节。结果结构化而非脚本化CI 结果不是简单打印日志而是收集为RunResults结构并用is_valid()统一判定便于bump-version中starter 未通过即中止的控制流。失败即显式报错版本替换依赖正则精确匹配匹配不到时抛出带路径上下文的Error::BumpVersion避免静默修改失败导致版本漂移。人与机器双保险交互式确认requestty为高风险的文件改写操作增加一道人工确认而 CI 门禁则保证 starters 与目标版本的一致性在发布前就被验证。小结xtask是理解 Loco 仓库工程化实践的一把钥匙cargo xtask test把主库 examples loco-new的 fmt/clippy/test 矩阵收敛为单条命令bump-version则通过本地路径依赖 → starters CI 验证 → 锁定版本的三段式流程把一次版本发布的前置工作自动化并加上了失败保护。对希望为自有 Rust 项目搭建类似发布流水线的开发者而言xtask/README.md 及其在 xtask/src 下的实现是一份可以完整照抄的工程模板。【免费下载链接】loco The one-person framework for Rust for side-projects and startups项目地址: https://gitcode.com/GitHub_Trending/lo/loco创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表