WSL 与 Windows 双环境 OpenCode 配置同步
Kirafishy
·
2026-04-29
·
via LINUX DO - 最新话题
WSL 与 Windows 双环境 OpenCode 配置同步实践 背景 在 WSL 和 Windows 双环境下使用 OpenCode 时,希望两边配置和会话数据能够同步,避免手动切换环境时丢失上下文。 主要分为两块:配置目录同步和会话数据库同步。把步骤直接丢给agent应该就能搞定了。 一、配置文件同步 OpenCode 的配置目录位于 ~/.config/opencode/ ,包含: opencode.json - 主配置(provider、model、MCP) AGENTS.md - 全局规则 hooks/ - 钩子脚本 agents/ - Agent 定义 command/ - 斜杠命令 方案 :符号链接,WSL 直接指向 Windows 配置目录 ln -s /mnt/c/Users/用户名/.config/opencode ~/.config/opencode ln -s /mnt/c/Users/用户名/.config/opencode ~/.opencode 优点: 修改任意一边自动同步 无需手动维护 注意: AGENTS.md 如果包含了操作系统相关的内容,需要修改为跨平台描述 二、会话数据库同步(失败 → 改进方案) 初期尝试:符号链接同步数据库 数据库位置: ~/.local/share/opencode/opencode.db (SQLite) ln -s /mnt/c/Users/用户名/.local/share/opencode ~/.local/share/opencode 遇到的问题 问题 1:SQLite 跨系统锁定冲突 Windows 和 WSL 同时运行 OpenCode 时,数据库被锁定 WSL 访问时报 disk I/O error SQLite 的 WAL 文件机制不支持跨文件系统并发 问题 2:路径格式混乱导致递归拼接 Windows 使用 \ 分隔符,WSL 使用 / OpenCode 解析路径时反复叠加,产生错误路径: /home/用户名/\home\用户名\\home\用户名\\home\用户名\C:\Users\用户名 数据库中出现多条错误 session 记录 解决方案:独立数据库 + 手动同步脚本 由于 SQLite 不支持跨系统同时访问,最终采用 独立数据库 + 切换前同步 方案: 1. 恢复 WSL 独立数据库 步骤略 2. 创建同步脚本 ~/.local/bin/opencode-sync #!/bin/bash WINDOWS_DB="/mnt/c/Users/用户名/.local/share/opencode/opencode.db" WSL_DB="$HOME/.local/share/opencode/opencode.db" check_process() { # 检查 WSL 进程(排除同步脚本自身) local opencode_procs=$(ps aux | grep -E "node|bun" | grep "opencode-ai" | grep -v grep | wc -l) if [ "$opencode_procs" -gt 0 ]; then echo "错误: WSL opencode 正在运行" return 1 fi # 检查 Windows 进程 local win_procs=$(powershell.exe -Command "(Get-Process opencode -ErrorAction SilentlyContinue).Count" 2>/dev/null | tr -d '\r\n') if [ "$win_procs" != "" ] && [ "$win_procs" -gt 0 ]; then echo "错误: Windows opencode 正在运行" return 1 fi return 0 } case "$1" in "push") # WSL → Windows check_process || exit 1 cp "$WSL_DB" "$WINDOWS_DB" rm -f "/mnt/c/Users/kirafishy/.local/share/opencode/opencode.db-wal" ;; "pull") # Windows → WSL check_process || exit 1 cp "$WINDOWS_DB" "$WSL_DB" rm -f "$HOME/.local/share/opencode/opencode.db-wal" ;; "auto") # 自动判断方向 check_process || exit 1 # 比较修改时间,从较新的同步到较旧的 ;; "status") # 查看状态 ;; esac ## 三、自动同步 Wrapper 为避免每次手动执行同步,创建 wrapper 脚本: **`~/.local/bin/opencode-wrapper`** ```bash #!/bin/bash OPENCODE_REAL="$HOME/.bun/bin/opencode" SYNC_SCRIPT="$HOME/.local/bin/opencode-sync" # 使用 trap 确保退出时同步(包括 Ctrl+C) cleanup() { echo "" echo ">>> 正在推送数据到 Windows..." "$SYNC_SCRIPT" push 2>/dev/null } trap cleanup EXIT # 启动前同步 echo ">>> 正在同步数据..." "$SYNC_SCRIPT" pull 2>/dev/null # 运行 opencode "$OPENCODE_REAL" "$@" 集成到 bashrc : alias opencode='$HOME/.local/bin/opencode-wrapper' 工作流程 : 启动 → pull (Windows→WSL) → 运行 opencode → 退出 → push (WSL→Windows) ↑ ↑ 包括 Ctrl+C 也触发 push (trap EXIT) 四、数据库清理 步骤略 五、最终架构 组件 同步方式 说明 配置文件 ( ~/.config/opencode ) 符号链接 实时同步 会话数据库 ( ~/.local/share/opencode/opencode.db ) 手动/自动脚本 切换环境前同步 wrapper ( opencode-wrapper ) 自动触发 运行 opencode 时自动同步 六、经验教训 SQLite 不支持跨系统并发 :WSL 和 Windows 通过 /mnt/c 访问同一个 SQLite 文件会有锁定冲突,不要尝试符号链接同步数据库 进程检测要精确 : pgrep -f "opencode" 会匹配脚本自身,需要更精确的匹配条件 Ctrl+C 退出仍需同步 :因为用到了佬友开发的Web UI: [开源自荐] OpenCodeUI (opencode webui) 。所以需要使用 trap EXIT 捕获所有退出方式,包括信号中断。 路径格式差异 :Windows \ 和 WSL / 混合可能导致解析错误,切换环境时要注意 七、使用指南 # 手动同步 opencode-sync pull # 切换到 WSL 前,从 Windows 拉取 opencode-sync push # 离开 WSL 前,推送到 Windows opencode-sync auto # 自动判断方向 opencode-sync status # 查看状态 # 自动同步(推荐) source ~/.bashrc # 加载 alias opencode serve ... # 自动 pull → 运行 → 退出自动 push 3 个帖子 - 3 位参与者 阅读完整话题
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。