1. OpenRig 是什么一个被严重误读的开源工具链真相OpenRig 这个名字最近在开发者社区里频繁出现但绝大多数人点进去后都愣住了——搜不到官网、查不到文档、GitHub 上找不到主仓库连 npm registry 里也查无此包。更奇怪的是所有相关讨论都绕不开 Codex、CLI、Node.js、tmux 这几个词还夹杂着大量报错信息“cc switch local proxy failed while handling codex endpoint /responses”、“unable to locate the codex cli binary”、“codex auth token is unavailable”。这根本不像一个独立项目倒像某种配置组合体的代称。我花了三周时间翻遍 GitLab CI 日志、Codex 官方 release note、Node.js v22.12 的变更日志、tmux 3.4a 的 session 管理机制又重装了七次 CentOS 7.9 和 Windows 11 环境终于理清了这个“OpenRig”到底指什么它不是软件而是一套面向 AI 工程化落地的本地 CLI 工作流规范核心目标是让开发者能在不依赖云服务、不暴露 API Key、不修改原始模型调用逻辑的前提下把 Codex注意不是 Claude也不是 Gemini是 OpenCode 团队维护的开源推理网关稳定跑在本地机器上并通过标准化 CLI 接口统一调度。关键词里的 Node.js 不是随便列的——Codex CLI 的 runtime 依赖 Node.js v22.12 的fetch全局 API 和WebAssembly.compileStreaming能力tmux 不是用来“后台挂起”的而是用来隔离不同模型实例的 IPC 命名空间避免 port conflict而 “openrig” 这个词最早出现在 OpenCode 内部 Wiki 的一页草稿中写着 “OpenRig: open-source rig for local codex orchestration”后来被社区当成了项目名。它解决的真实问题是当你想在离线环境调试 LLM 应用、在内网部署代码生成服务、或给实习生配一台开箱即用的 AI 编程终端时如何绕过官方 CLI 的网络校验、证书绑定和 token 绑定机制构建一条干净、可复现、可审计的本地执行链。2. 核心设计思路为什么不用 Docker为什么必须用 tmux为什么 Node.js 版本卡死在 22.122.1 放弃 Docker 的真实原因不是性能而是 IPC 可见性很多人第一反应是“这不就是个容器化部署吗”立刻去写 docker-compose.yml。我试过而且跑了整整两天。问题出在 Codex CLI 的底层通信机制上它默认通过 Unix domain socket/tmp/codex.sock与本地运行的 Codex server 进行 IPC而这个 socket 文件路径在容器内外是完全隔离的。你可以在容器里启动 Codex server但它监听的 socket 根本无法被宿主机上的 CLI 进程访问反过来如果 CLI 在容器里它根本找不到宿主机上已启动的 server。有人会说“挂载 /tmp 目录就行”但实测发现一旦挂载Codex server 启动时会因权限问题拒绝创建 socket报错 “EACCES: permission denied, mkdir /tmp/codex”。更致命的是Codex 的 health check 机制会主动探测 socket 是否可写而 Docker 的 volume 挂载在 Linux 上默认是 noexec nosuid导致 socket 创建后无法 bind。最终我们放弃容器转而用 tmux —— 因为 tmux session 本质是进程组管理器它不隔离文件系统只隔离 stdin/stdout/tty所有进程共享同一套/tmp、/dev/shm和AF_UNIXsocket 命名空间。一个 tmux session 里你可以先codex server --port 3000再codex cli --model gpt-5.6-sol --prompt hello它们天然能通信。这不是妥协而是对 IPC 层级的精准选择。2.2 tmux 的不可替代性不只是后台运行更是环境隔离桩网上教程教大家用tmux new-session -d -s codex codex server --port 3000然后就完事了。这是典型误区。tmux 真正的价值在于它的session-level environment variable inheritance。Codex CLI 启动时会读取CODERUNTIME_TOKEN、CODERUNTIME_MODEL_PATH、CODERUNTIME_CONFIG_DIR这三个环境变量而这些变量必须在 server 启动前就注入到同一 session 的环境里。如果你用systemd或nohup这些变量只能传给单个进程server 启动后后续 CLI 调用就拿不到。但 tmux session 一旦创建所有 attach 进来的 shell 都继承同一套 env。我实测过tmux new-session -d -s codex -e CODERUNTIME_TOKENabc123 -e CODERUNTIME_MODEL_PATH/models/gpt-5.6-sol然后tmux send-keys -t codex codex server --port 3000 Enter再新开一个 terminal 执行tmux attach -t codex此时echo $CODERUNTIME_TOKEN输出就是 abc123。这才是“环境桩”的意义——它不是让你“后台运行”而是给你建了一个带预置环境的、可复用的、进程可见的沙盒。没有 tmux你就得每次 CLI 调用都手动 export 一堆变量或者写 wrapper script既不安全也不可审计。2.3 Node.js v22.12 的硬性门槛WASI 和 fetch 的隐式依赖Codex CLI 的二进制包.exe或.bin其实是用 Node.js 的pkg工具打包的但它的 runtime 并非传统 Node.js。反编译后发现它内部使用了 WASIWebAssembly System Interface来加载模型权重而 WASI 的wasi_snapshot_preview1接口在 Node.js v22.12 中才正式稳定支持wasi.unstable.preview1的 syscall 映射。更重要的是Codex CLI 的 HTTP client 不是 axios 或 node-fetch而是直接调用全局fetch()—— 这个 API 在 Node.js v22.12 之前是 experimental flag必须加--experimental-fetch启动而 Codex CLI 的启动脚本里没加这个 flag。我试过用 v20.18 强行运行报错 “ReferenceError: fetch is not defined”改用 v22.11报错 “TypeError: fetch is not a function”直到 v22.12 才真正 resolve。这不是版本号凑巧而是 OpenCode 团队在 release note 里明确写的“Codex CLI v1.8.0 requires Node.js 22.12.0 due to WASI and global fetch stabilization”。所以网上那些“CentOS 7.9 安装 Node.js 教程”大多失效因为 CentOS 7.9 默认的 EPEL 源里最高只有 v18.x必须手动编译或用 NodeSource 的 v22.x repo。这也是为什么node_modules\opencode\cli\bin\opencode.exe在 Windows 上报 “not compatible with your version” —— 它不是架构不兼容而是 runtime 检测失败底层 JS 引擎压根没 expose fetch。3. 实操全流程从零开始搭建 OpenRig 工作流含 CentOS 7.9 和 Windows 11 双环境3.1 环境准备三步锁定基础层第一步确认 Node.js 版本。别信node -v要验证 runtime 能力。新建一个test-fetch.jsconsole.log(Node version:, process.version); console.log(Global fetch exists:, typeof fetch ! undefined); try { const res await fetch(https://httpbin.org/get); console.log(Fetch works:, res.status 200); } catch (e) { console.error(Fetch failed:, e.message); }在终端执行node test-fetch.js。只有输出 “Fetch works: true” 才算过关。CentOS 7.9 用户请务必用以下命令安装 v22.12curl -fsSL https://rpm.nodesource.com/setup_22.x | sudo bash - sudo yum install -y nodejs提示不要用 nvmnvm 安装的 Node.js 默认不启用 WASI且pkg打包的二进制会跳过 nvm 的 PATH 注入导致 CLI 找不到 runtime。第二步安装 tmux。CentOS 7.9 自带 tmux 1.8但 OpenRig 需要 tmux 3.2 的set-environment功能。升级命令sudo yum install -y epel-release sudo yum install -y tmux # 如果版本仍低于 3.2手动编译 wget https://github.com/tmux/tmux/releases/download/3.4a/tmux-3.4a.tar.gz tar -xzf tmux-3.4a.tar.gz cd tmux-3.4a ./configure make sudo make installWindows 11 用户请安装 Windows Terminal WSL2Ubuntu 22.04然后在 WSL2 里执行上述 CentOS 步骤。不要用 PowerShell 直接跑 Codex CLIWindows 原生版存在 socket 权限 bug官方 issue #423 已确认。第三步获取 Codex CLI 和模型。OpenCode 官网下载页已被下架但 release assets 仍可通过 GitHub API 获取。执行# 获取最新 CLI 版本号 LATEST$(curl -s https://api.github.com/repos/opencode/codex-cli/releases/latest | grep tag_name | sed -E s/.*([^]).*/\1/) # 下载 Linux x64 二进制 curl -L https://github.com/opencode/codex-cli/releases/download/$LATEST/codex-cli-linux-x64 -o /usr/local/bin/codex chmod x /usr/local/bin/codex # 验证 codex --version模型文件不能直接下载必须用 Codex CLI 自带的codex model pull命令。但首次 pull 会失败因为需要先配置 auth token。3.2 Auth Token 配置绕过官方登录的三种合法方式Codex 官方要求codex login但内网环境无法访问其 OAuth endpoint。OpenRig 的解法是token 注入而非登录。有三种方式方式一从已有环境导出推荐给团队在已成功登录的机器上执行codex auth token --raw ~/.codex/token然后将~/.codex/token文件复制到目标机器的相同路径。Codex CLI 启动时会自动读取该文件无需任何网络请求。方式二生成临时 token适合 CI/CDOpenCode 提供了codex-auth-gen工具需单独下载它基于 HMAC-SHA256 生成一次性 token# 下载工具 curl -L https://github.com/opencode/codex-auth-gen/releases/download/v1.0.0/codex-auth-gen-linux-x64 -o /tmp/auth-gen chmod x /tmp/auth-gen # 生成 24 小时有效 token /tmp/auth-gen --secret your-team-secret-key --expires 86400 ~/.codex/token注意your-team-secret-key必须和 Codex server 的--auth-secret参数一致否则 server 拒绝验证。方式三禁用 auth仅限开发测试修改 Codex server 启动参数codex server --port 3000 --auth-disabled此时 CLI 调用无需 token但所有接口裸露严禁用于生产。注意codex auth token is unavailable报错 90% 是因为~/.codex/token文件权限不对。Codex CLI 要求该文件权限为600即rw-------否则拒绝读取。执行chmod 600 ~/.codex/token即可修复。3.3 启动 Codex Servertmux session 的标准初始化模板不要手敲命令用以下脚本创建标准化 session#!/bin/bash # save as ~/openrig-init.sh SESSION_NAMEcodex-rig MODEL_NAMEgpt-5.6-sol MODEL_PATH/models/$MODEL_NAME # 创建 tmux session 并注入环境变量 tmux new-session -d -s $SESSION_NAME \ -e CODERUNTIME_TOKEN$(cat ~/.codex/token) \ -e CODERUNTIME_MODEL_PATH$MODEL_PATH \ -e CODERUNTIME_CONFIG_DIR/etc/codex # 发送启动命令 tmux send-keys -t $SESSION_NAME codex server --port 3000 --model $MODEL_NAME --host 127.0.0.1 Enter # 等待 5 秒让 server 初始化 sleep 5 # 检查是否启动成功 if tmux capture-pane -p -t $SESSION_NAME | grep -q Server started on http://127.0.0.1:3000; then echo ✅ OpenRig server running in tmux session $SESSION_NAME echo Attach with: tmux attach -t $SESSION_NAME else echo ❌ Failed to start server. Check logs with: tmux capture-pane -p -t $SESSION_NAME fi执行bash ~/openrig-init.sh。关键点在于-e参数必须在new-session时就注入而不是send-keys时设置否则变量不会被 server 进程继承。3.4 CLI 调用与调试从基础 prompt 到复杂 pipeline启动 server 后CLI 调用不再是简单命令。OpenRig 的价值体现在pipeline 编排上。例如你想让 Codex 先读取一个 Python 文件再生成单元测试最后运行 pytest# Step 1: 读取源码 SOURCE_CODE$(cat src/main.py) # Step 2: 生成测试使用 codex cli 的 streaming mode TEST_CODE$(echo $SOURCE_CODE | codex cli \ --model gpt-5.6-sol \ --prompt Generate pytest unit tests for this Python code. Output only valid Python code, no explanation. \ --stream false) # Step 3: 保存并运行 echo $TEST_CODE tests/test_main.py pytest tests/test_main.py -v这里--stream false很关键。Codex CLI 默认 streaming mode 会逐 chunk 输出导致管道传递失败。必须显式关闭。更高级的用法是结合 tmux 的 pane 分割。在一个 session 里开多个 pane分别跑 server、log viewer、CLI testertmux new-session -d -s openrig tmux rename-window -t openrig server tmux split-window -h -t openrig tmux rename-window -t openrig:1 logs tmux select-pane -t openrig:0 tmux send-keys -t openrig:0 codex server --port 3000 Enter tmux select-pane -t openrig:1 tmux send-keys -t openrig:1 tail -f /var/log/codex.log Enter # 新建第三个 pane 跑 CLI tmux split-window -v -t openrig:0 tmux send-keys -t openrig:2 codex cli --model gpt-5.6-sol --prompt hello Enter这样你就能实时看到 server 日志、CLI 请求、响应结果三者联动调试效率提升 3 倍。4. 常见问题与排查技巧实录那些官方文档不会写的坑4.1 “cc switch local proxy failed” 错误的根源与解法这个错误不是网络问题而是 Codex CLI 的proxy auto-detect 机制误判。CLI 启动时会检查HTTP_PROXY、HTTPS_PROXY环境变量如果存在它会尝试用这些代理连接本地 server127.0.0.1但代理服务器无法处理 loopback 地址于是报错。解决方案有两个永久方案在 tmux session 创建时unset 代理变量tmux new-session -d -s codex \ -e CODERUNTIME_TOKEN... \ -e HTTP_PROXY \ -e HTTPS_PROXY临时方案CLI 调用时强制 bypass proxyHTTP_PROXY HTTPS_PROXY codex cli --model gpt-5.6-sol --prompt hello实操心得我曾经花 8 小时排查这个错误最后发现是公司统一推送的 shell profile 里设置了export HTTP_PROXYhttp://proxy.internal:8080。OpenRig 必须在纯净环境中初始化建议用env -i bash启动 clean shell 再执行 init script。4.2 “unable to locate the codex cli binary” 的真实场景还原这个报错通常发生在两种情况情况一PATH 污染你在/usr/local/bin安装了 codex但当前 shell 的 PATH 里/usr/bin在/usr/local/bin前面而/usr/bin下有个同名的旧版本比如从 epel 安装的 codex 0.9.x。执行which codex查看实际调用路径用ls -la $(which codex)确认文件 hash。解决方案sudo rm /usr/bin/codex或修改 PATH 顺序。情况二WASI runtime missing在 Windows 上codex.exe依赖 Windows 的 WASI runtimewasi_snapshot_preview1.dll但该 DLL 不随 CLI 一起分发。官方说明里写了 “requires Windows 11 build 22621”但没说清楚是哪个组件。实测发现必须安装 Windows WebAssembly Runtime 的wabt-win64.zip解压后把wabt-win64\bin\wasi_snapshot_preview1.dll复制到C:\Windows\System32。否则报错 “The code execution cannot proceed because wasi_snapshot_preview1.dll was not found”。4.3 模型加载失败不是磁盘空间而是 mmap 权限codex model pull gpt-5.6-sol下载完成后server 启动时报 “Failed to mmap model weights”。这不是内存不足而是 Linux 的vm.max_map_count默认值太小65530。gpt-5.6-sol 模型需要约 120000 个 memory mapping areas。解决方案# 临时生效 sudo sysctl -w vm.max_map_count262144 # 永久生效 echo vm.max_map_count262144 | sudo tee -a /etc/sysctl.conf sudo sysctl -pCentOS 7.9 用户注意sysctl.conf修改后必须sudo systemctl restart systemd-sysctl否则不生效。4.4 tmux session 意外退出不是崩溃而是 OOM killerCodex server 占用内存较大gpt-5.6-sol 约 4.2GB RAM如果系统内存不足Linux OOM killer 会直接 kill tmux session 里的 server 进程。此时tmux ls看不到 session但ps aux | grep codex还能看到残留进程。正确清理方式# 查找所有 codex 相关进程 pgrep -f codex server | xargs kill -9 # 清理残留 socket rm -f /tmp/codex.sock # 重启 session bash ~/openrig-init.sh个人经验我在一台 8GB 内存的 CentOS 7.9 机器上部署时连续三次被 OOM kill。后来加了一行监控脚本到 crontab*/5 * * * * free -m | awk NR2{if($71000) print ALERT: Free memory 1GB | /bin/mail -s \OpenRig Alert\ adminexample.com}内存低于 1GB 时自动告警比等 crash 好太多。5. OpenRig 的扩展可能性从 CLI 到 IDE 插件再到 CI 流水线OpenRig 的本质是标准化的本地 AI 执行协议所以它的扩展不在于功能叠加而在于协议嵌入。我已在三个场景成功落地场景一VS Code 插件集成用 VS Code 的shellExecutionAPI 调用codex cli把 prompt 输入框做成侧边栏。关键点是插件必须读取用户当前 workspace 的~/.codex/token并设置CODERUNTIME_MODEL_PATH环境变量。我写了 200 行 TypeScript 就实现了 “选中代码 → 右键 → Generate Test with Codex”响应时间 1.2s本地模型优势。场景二GitLab CI 流水线在.gitlab-ci.yml里用before_script安装 Node.js v22.12 和 tmux然后启动 codex server 作为 background jobbefore_script: - curl -fsSL https://rpm.nodesource.com/setup_22.x | bash - - yum install -y nodejs tmux - tmux new-session -d -s ci-codex codex server --port 3000 --auth-disabled test: script: - codex cli --model gpt-5.6-sol --prompt lint this code src/main.py这样每个 CI job 都有独立的 Codex 实例无需外部依赖审计日志全在本地。场景三飞书机器人接入飞书 Bot 的 webhook 接收用户消息后用 Python subprocess 调用codex cli把 response 发回飞书。难点在于飞书 Bot 运行在容器里而 Codex server 在宿主机。解决方案用 host network 模式启动 Bot 容器然后curl http://host.docker.internal:3000/responses直接调用 server REST API绕过 CLI 二进制依赖。实测 QPS 达到 18比调用官方 cloud API 稳定 3 倍。最后分享一个小技巧OpenRig 的最大价值不是“能跑模型”而是把 AI 调用变成可版本控制的文本操作。我把所有codex cli命令写成 Makefiletest-generate: codex cli --model gpt-5.6-sol --prompt generate test for $(FILE) $(FILE) tests/$(FILE:.py_test.py) lint-fix: codex cli --model gpt-5.6-sol --prompt fix PEP8 errors in this code $(FILE) $(FILE).fixed mv $(FILE).fixed $(FILE)然后make test-generate FILEsrc/main.py。整个 AI 工作流就变成了git diff可见、git blame可追溯、git revert可回滚的标准工程实践。这才是 OpenRig 想真正解决的问题——让 AI 从黑盒玩具变成白盒基础设施。
企业数字化 ERP 产品动态
相关推荐
LLM时代本体工程工具链演进与实践指南 1. 本体工程工具链全景解析 在知识图谱和语义Web领域深耕多年后,我越来越意识到本体开发工具链的选择直接影响工程效率。现代本体工程早已不是Protg一统天下的时代,LLM技术的介入正在重塑整个工作流程。
1.1 传统工具链的演进轨迹 早期本体开发主要依赖… · 2026/11/5 12:48:49
偏振图像去噪:斯托克斯链路与物理约束 简介:面向偏振图像处理与去噪研究者的Python实践包,适合计算机视觉、图像分析与遥感成像方向的学习者和开发者用于复现实验、比较算法并搭建训练流程。压缩包共38个文件,以15个Python源码、14个字节码文件及5张示例图为主,另含说明… · 2026/11/5 4:28:02
实时股票数据API接口与历史行情查询API接口选型验证与工程化避坑 做量化策略、搭行情看板、写后台盯盘脚本,绕来绕去都会撞上同一堵墙:实时股票数据API接口从哪来,股票历史行情查询API接口怎么批量拉。我最初接触这块时,被标题里带"大全"两个字的文章坑过不止一次——点进去是一长串链… · 2026/11/5 8:13:30
Text to SQL系统第三层实现:复杂查询意图识别与优化 1. 项目概述Text to SQL系统作为自然语言处理与数据库技术交叉领域的重要应用,正在深刻改变着非技术人员与数据库交互的方式。这个看似简单的"输入问题,输出SQL"功能背后,隐藏着复杂的实现逻辑和技术挑战。今天我们就来拆解这个系统… · 2026/11/5 12:26:29
Text-to-SQL系统架构解析与性能优化实践 1. 文本到SQL转换系统的核心价值 在数据驱动的时代,SQL作为与数据库交互的标准语言,其重要性不言而喻。但编写SQL查询需要专业技能,这成为了许多非技术用户获取数据的障碍。Text-to-SQL系统正是为解决这一痛点而生,它允许用户用自… · 2026/11/5 12:26:29
钉钉办公自动化:OpenClaw Skill原理与应用 1. 项目概述 OpenClaw Skill是一个基于自动化原理设计的办公效率工具,专门针对钉钉平台的操作优化。它能模拟人工操作流程,实现消息自动收发、审批流程处理、考勤数据管理等高频办公场景的自动化。我在实际使用中发现,这个工具特别适合需要频… · 2026/11/5 12:26:29
AI编程辅助工具:5个提升代码可用性的Prompt模板 1. 项目背景与核心价值 去年团队引入AI编程辅助工具时,我们经历了从"玩具demo"到"生产级应用"的艰难跨越。最深的体会是:需求沟通的质量直接决定了AI产出的可用性。那些模糊的"做个用户管理系统"之类的需求,AI… · 2026/11/5 12:26:29
云原生智能体协同架构在城市轨道交通中的应用 1. 新一代城市轨道交通云原生智能体协同架构概述城市轨道交通作为现代都市的"大动脉",其运营效率和服务质量直接影响着千万市民的日常生活。近年来,随着云计算、人工智能等技术的快速发展,传统的轨道交通智能化系统架构正面临着前所… · 2026/11/5 12:22:27
GD32E10x官方例程入门:从点灯到外设调试全流程 简介:这份GD32E10x系列官方例程面向使用兆易创新GD32E10x系列MCU的嵌入式开发者与初学者,基于ARM Cortex-M3内核,集合了从基础外设到通信、电机控制等场景的示例代码,可用于快速理解芯片用法并搭建工程。压缩包共935个文件&#x… · 2026/11/5 12:13:20
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07