尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Optimism 单仓库的构建环境统一:mise 如何管理 CI 与本地开发的全部工具链
Optimism 单仓库的构建环境统一mise 如何管理 CI 与本地开发的全部工具链【免费下载链接】optimismOptimism is Ethereum, scaled.项目地址: https://gitcode.com/GitHub_Trending/op/optimism本篇技术指南以 Optimism 单仓库的 CI 参考文档 Mise 为主体讲清楚该仓库如何用 mise 统一管理 Go、Rust、Foundry 等全部构建依赖。读完你可以掌握为什么所有构建期依赖必须定义在 mise.toml这条纪律能带来确定性构建、如何在 mise.toml 中正确添加新依赖包括需要[tool_alias]的 GitHub 多可执行包以及 CI 管道中 mise 的安装、缓存与 PATH 注入是怎么落地的。为什么用 mise 管理构建环境Optimism 的 CI 参考手册 ops/book 中给出了这套做法的核心动机见 Mise 章节构建环境通过一个名为 mise 的工具管理。Mise 提供安装和管理本仓库中构建、测试各包所需全部依赖的便捷方式。它保证了流水线中的每个 job 都运行在完全相同的一套工具之上从而带来更确定的构建、更少的环境相关问题。具体机制是mise 在一个配置文件mise.toml中定义所需软件Go、Foundry 等的版本清单CI 管道在每个 job 开始时执行 mise确保依赖以正确版本安装。由此产生一条硬性约束——所有构建期依赖都必须定义在 mise.toml 中。正因如此仓库官方建议开发者在本地开发时也使用 mise本地与 CI 共用同一份工具清单在我机器上能跑的环境漂移问题被从根上消除。读透 mise.tomlOptimism 的构建依赖清单仓库根目录的 mise.toml 就是上述文档所说的唯一事实来源。按功能可以分为几个层次核心语言工具链# Core dependencies bun 1.4.0 go 1.26.5 golangci-lint 2.8.0 gotestsum 1.12.3 mockery 2.53.6 rust [ { version 1.95.0, components clippy,rustfmt,llvm-tools, targets riscv32imac-unknown-none-elf,wasm32-unknown-unknown,wasm32-wasip1 }, { version nightly-2026-08-22, components rustfmt,clippy }, ] python 3.12.13 ...几个值得注意的细节rust 是数组形式同时固定了一条 stable 工具链1.95.0附带clippy,rustfmt,llvm-tools组件和riscv32imac、wasm32等多个交叉编译 target和一条 nightly 工具链nightly-2026-08-22只有 rustfmt/clippy满足 rust 工作区中不同 crate 对工具链的差异化要求。清单还覆盖了 shell 侧工具jq、yq、shellcheck、shfmt、ripgrep、just、make。其中 ripgrep 的注释说明了动因ops/scripts/todo-checker.sh依赖它在这里固定版本而不是在 CI 里 apt 安装这样检查步骤走的是 mise 缓存不依赖 Ubuntu 镜像源的可达性——这正是mise 保证确定性思路的典型体现。构建 Rust 工作区所需的protocprost-build 会 shell out 调用它缺失会导致构建失败和仅 Linux 使用的快速链接器mold注释明确说明mold 没有 macOS 构建所以用os [linux]门控避免开发者的 Mac 上mise install失败也都在清单里。多后端语法github: / go: / pipx:Optimism 的清单展示了 mise 的不同后端写法# Rust tooling从 GitHub Release 安装 github:nextest-rs/nextest { version 0.9.132, version_prefix cargo-nextest-, bin cargo-nextest } github:succinctlabs/sp1 { version 6.8.0, version_prefix v, bin cargo-prove } lycheeverse/lychee { version 0.23.0, version_prefix lychee-v, bin lychee } # Go 依赖按 Go 模块路径安装 go:github.com/ethereum/go-ethereum/cmd/abigen 1.15.10 go:github.com/ethereum/go-ethereum/cmd/geth e9bac5fac00d77fe87e4c1a28c48ee57cda942cc # Glamsterdam development commit. # Python 依赖pipx 虚拟环境 pipx:slither-analyzer 0.10.2 pipx:semgrep 1.137.0 pipx:md_toc 9.0.0可以看到三个后端各管一摊github:用于任意 GitHub 仓库的 Release 二进制go:用于按 Go 包路径构建/安装的 Go 工具包括把 geth 固定在某个具体的开发 commit 上pipx:用于 Python 工具。每个条目都是精确版本号或 commit hash没有任何latest之类的浮动值。Foundry 特例一个 release 提供多个二进制# Foundry dependencies # Foundry is a special case because it supplies multiple binaries at the same # GitHub release, so we need to use the aliasing trick to get mise to not error forge 1.2.3 cast 1.2.3 anvil 1.2.3Foundry 的三个二进制forge/cast/anvil发布在同一个 GitHub release 中直接声明会因命名冲突报错因此文档中提到的aliasing trick在这里落地三个工具名都指向同一个版本1.2.3配合下文的[tool_alias]指向同一个仓库。这也印证了 CI 中按mise.toml的 checksum 做缓存锚点的做法——.circleci/continue/main.yml 中注释写明用 mise.toml 来锚定底层 forge/svm 的版本缓存 key 形如svm-cache-{{ checksum mise.toml }}。假依赖与 [settings]# Fake dependencies # Put things here if you need to track versions of tools or projects that cant # actually be managed by mise (yet). Make sure that anything you put in here is # also found inside of disabled_tools or mise will try to install it. kontrol 1.0.255 binary_signer 1.0.4 [settings] experimental true pipx.uvx true disable_tools [kontrol, binary_signer]这是一个值得借鉴的模式对于暂时无法由 mise 真正管理的工具如 Kontrol、binary-signer仍可以在[tools]中登记其版本号以跟踪版本演进但必须同时加入[settings]的disable_tools列表否则 mise 会尝试安装。对应的[tool_alias]里用github:ethereum-optimism/fake-kontrol之类的占位源满足新版 mise 即使不安装也要有已知安装来源 的校验。添加新的 mise 依赖原文档 Adding New Mise Dependencies 给出的操作路径是大多数情况下添加一个新的 mise 依赖就像往mise.toml里加一个包一样直接。但有些包需要额外配置。常规依赖直接在[tools]中新增一行并固定版本即可例如按现有条目风格jq 1.7.1。原则与清单中既有注释一致版本必须精确固定CI 才能复现。需要别名的包Aliased Packages原文档明确了需要别名的两种情况GitHub 包暴露了多个可执行文件或可执行文件名与包名不同。此时需要三步在[tool_alias]小节中以包名命名一个别名把别名配置为指向包仓库并在末尾用[binyour-executable]指定可执行文件例如github:goreleaser/goreleaser-pro[bingoreleaser,version_prefixv]若上游 release tag 带v前缀必须追加version_prefixv——因为 mise 的github:后端不会自动剥离前缀把该包及其版本加入[tools]小节。mise.toml 的[tool_alias]小节就是这套规则的完整示范[tool_alias] forge github:foundry-rs/foundry[binforge,version_prefixv] cast github:foundry-rs/foundry[bincast,version_prefixv] anvil github:foundry-rs/foundry[binanvil,version_prefixv] just github:casey/just goreleaser-pro github:goreleaser/goreleaser-pro[bingoreleaser,version_prefixv] gotestsum github:gotestyourself/gotestsum[version_prefixv] mockery github:vektra/mockery[version_prefixv] svm-rs github:alloy-rs/svm-rs[binsvm,version_prefixv]逐条对照可以看出三类形态同仓库多二进制Foundry 三件套共享一个上游仓库仅bin不同可执行文件名 ≠ 包名goreleaser-pro包的可执行文件是goreleasersvm-rs包的可执行文件是svm都需要bin显式映射tag 前缀不标准gotestsum/mockery等 tag 带v前缀只需version_prefixv而lychee的 tag 形如lychee-v0.23.0前缀本身含v所以写成version_prefix lychee-v——写错前缀会导致 mise 找不到 release。另外注意[tools]里的rust数组中stable 版本显式声明了components与targets从源码结构看riscv32imac-unknown-none-elf这一目标对应 Rust 侧的裸机/嵌入式产物如 SP1/Kona 相关的 zkVM 工件新增工具时若涉及交叉编译应参照此写法把所需 target 一并固定。mise 在 CI 管道中的落地方式文档强调CI 管道在每个 job 开始处运行 mise从 .circleci/config.yml 可以看到这条纪律的工程化实现存在专门的utils/install-mise与utils/checkout-with-mise步骤orb各 job 通过enable_mise_cache: true/enable-mise-cache: true参数复用共享的 mise 缓存。配置注释解释了一个关键设计有一个前置 job必须保持完整、未过滤的mise install——因为 orb 把/data/mise-data保存在一个 write-once 的缓存 key 下当 mise.toml 变更或缓存被逐出时只有这个 job 会执行冷安装。换言之谁先触发冷安装谁就为整条流水线铺好了工具层。安装完成后job 会把 mise 的二进制目录注入PATH# mise shims re-resolve the tool on every invocation ... echo export PATH\$(mise bin-paths | paste -sd: -):$PATH\ $BASH_ENV注释提到 mise 的 shim 每次调用都会重新解析工具版本因此直接把mise bin-paths的完整列表放进PATH供 yq/jq 等脚本调用时即取即用。从源码结构看缓存分层也很细Rust 侧按rust-toolchain-vversion-{{ checksum mise.toml }}-...组合 key 缓存/data/mise-data/.cargo/registry、.cargo/git、.rustup等目录见 .circleci/continue/main.ymlSVM/solc 侧则以svm-cache-{{ checksum mise.toml }}-solc 版本为 key。mise.toml的 checksum 同时充当了依赖变更的失效信号改动了工具清单缓存自动重建无需人工清理。环境修复也有专门步骤如 .circleci/continue/helpers.yml 中的 Fix rust mise environment variables 命令用于修正 mise 环境下的 Rust 环境变量。另外MISE_GITHUB_TOKEN环境变量被用于给 mise 拉取 GitHub release 提供认证配额见 config.yml 中的注释这解释了为何清单可以大量使用github:后端而不受匿名 API 限流影响。本地开发与 mise 的安装官方建议本地开发也走 mise理由前文已述与 CI 同构。仓库提供了两个配套入口独立安装脚本ops/scripts/install_mise.sh一个纯 POSIX sh 的引导安装器支持 Linux/macOS 与 x86_64/ARM含 musl 变体默认安装版本固定在v2025.3.2安装到~/.local/bin/mise可用MISE_VERSION、MISE_INSTALL_PATH覆盖。它内置 SHA-256 校验当前版本使用内置静态校验和其它版本从 release 的SHASUMS256.txt拉取比对并在结束时按你的 shellzsh/bash/fish打印mise activate shell的激活指引最后建议运行mise doctor验证配置。进入仓库即生效一旦 mise 激活mise.toml即被识别mise install会按清单拉齐全部工具direnv也在[tools]清单中direnv 2.35.0从源码结构看配合它可以在不同子目录间切换时自动加载各目录的环境变量。日常可用的验证动作包括mise doctor检查配置、mise bin-paths查看实际二进制位置CI 正是用它拼PATH、以及按版本清单核对本地go、forge等命令是否指向 mise 管理的目录。小结mise 纪律带来的三条收益确定性CI 与本地共用 mise.toml 这一份精确到版本乃至 commit hash的工具清单构建期依赖必须进 mise.toml成为硬性准入规则。可缓存CI 以mise.toml的 checksum 作为 Rust/SVM 等各层缓存的锚点依赖不变则缓存命中变更则自动失效重建见 .circleci/continue/main.yml。可表达复杂上游github:/go:/pipx:多后端加上[tool_alias]的bin与version_prefix机制使 Foundry 多二进制、非标准 tag 前缀、按 Go 模块路径安装等别扭场景都能被一份声明式清单完整描述无法真正管理的工具还能以 fake dependency disable_tools的方式保留版本跟踪。对贡献者而言最直接的行动项就三条新增依赖先写进[tools]遇到多二进制或命名不匹配时按三步加[tool_alias]改完清单本地mise install验证再交给 CI 的 checksum 锚点去触发缓存重建。【免费下载链接】optimismOptimism is Ethereum, scaled.项目地址: https://gitcode.com/GitHub_Trending/op/optimism创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

动基座粗对准:速度观测量选择与杆臂补偿工程实践

动基座粗对准:速度观测量选择与杆臂补偿工程实践

简介:本资源是一份面向惯性导航领域高校师生、科研人员及工程技术人员的专业技术文档,聚焦捷联惯导系统(SINS)在动态载体条件下的初始对准难题,系统阐述基于惯性系原理的动基座粗对准方法及其关键性能影响因素。文档深…

📅 2026/9/17 16:43:19
ETC解决方案工程实践:从RSU/OBU选型到交易一致性调优

ETC解决方案工程实践:从RSU/OBU选型到交易一致性调优

简介:一份面向智能交通与高速公路收费系统设计人员的ETC(电子不停车收费)解决方案资料。文档以射频识别技术为核心,系统梳理了ETC的应用背景、无源射频卡(电子标签)相比传统磁卡的非接触性、响应速度快、安…

📅 2026/9/17 16:43:19
Caris 7.1多波束后处理:船文件与TPU配置实操指南

Caris 7.1多波束后处理:船文件与TPU配置实操指南

简介:Caris多波束后处理.doc是一份基于Caris 7.1软件编写的多波束数据后处理实操文档,面向海洋测绘、水文调查、港口航道测量等领域的工程技术人员,解决测深数据采集后的船型配置与参数校正问题。文档以分步操作方式展开,从建立船…

📅 2026/9/17 16:38:18
MORE NEWS

更多资讯

📰

Aptos MoveFlow move-check 技能:Move 编译错误诊断与修复的完整工作流

Aptos MoveFlow move-check 技能:Move 编译错误诊断与修复的完整工作流 【免费下载链接】aptos-core Aptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience. 项目地址: https://gitc…

📰

AI编程助手选型指南:从Copilot替代到专属Agent构建

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

斐讯T1 刷 Armbian 完整教程:3 步把 S912 盒子改成 24 小时家庭服务器

斐讯T1 刷 Armbian 完整教程:3 步把 S912 盒子改成 24 小时家庭服务器 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, …

📰

国产电源芯片选型避坑指南:DC-DC与LDO可靠性实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Cemu控制器映射三步搞定:Wii U手柄按键配置快速上手

Cemu控制器映射三步搞定:Wii U手柄按键配置快速上手 【免费下载链接】Cemu Cemu - Wii U emulator 项目地址: https://gitcode.com/GitHub_Trending/ce/Cemu Cemu控制器映射是把你手边手柄或键盘的按键,分配给模拟器里 Wii U 虚拟控制器的过程&am…

📰

禾川伺服驱动器参数上传下载:从USB转串口到Modbus RTU脚本批量管理

简介:禾川伺服驱动器在工业自动化现场应用广泛,其参数备份与恢复是调试维护的重要环节。这份docx文档针对该需求提供了一套完整的USB串口参数上传与下载操作指引,适合电气工程师、设备维护人员以及使用HCS-Studio调试软件的技术人员参考。文档…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬