惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
I
InfoQ
B
Blog RSS Feed
D
Docker
GbyAI
GbyAI
N
Netflix TechBlog - Medium
Y
Y Combinator Blog
F
Fortinet All Blogs
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
人人都是产品经理
人人都是产品经理
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
M
MIT News - Artificial intelligence
C
Check Point Blog
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
博客园 - Franky
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
Last Week in AI
Last Week in AI
L
LangChain Blog

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派
Windows 下折腾 opencode 的踩坑记录 - 少数派
2026-01-26 · via 少数派

最近在 Windows 主力机上折腾 opencode 及其插件 oh-my-opencode,过程中遇到了不少“水土不服”的问题。特此记录两个卡住我许久的坑及其解决思路。

一、 BunInstallFailedError 与杀毒软件的“手速”之争

在安装插件依赖后,启动 opencode 直接抛出错误:

{
  "name": "BunInstallFailedError",
  "data": { "pkg": "oh-my-opencode", "version": "latest" }
}

通过运行 opencode stats 定位到日志文件,核心报错信息指向了权限问题:

error: moving "typescript" to cache dir failed
EPERM: Operation not permitted (NtSetInformationFile())

初看以为是系统文件权限不足,但手动操作文件一切正常。深入排查后发现,这其实是一场 Bun 与杀毒软件的竞速赛

Bun 下载并解压文件的速度极快,当它试图将临时文件移动到缓存目录时,Windows Defender(或第三方杀毒软件)监测到写入动作,立即触发实时扫描并对文件夹进行了 文件锁(Lock)。Bun 此时尝试重命名或移动,便会因文件被占用而报错。

解决方法: 最彻底的办法是将相关路径加入杀毒软件的白名单。这也提供了一个排查 Windows 下开发环境问题的思路:遇到莫名的 EPERM 或编译卡顿[^1],除了查权限,不妨先关掉杀毒软件试试。

二、 Agent 无法识别 export 命令

在使用 /review 或要求 Agent 执行 git 命令时,会陷入无限报错循环:

'export' is not recognized as an internal or external command...

原因是插件为了禁用交互式提示,强行在命令前注入了一长串 Unix 风格的环境变量定义(如 export CI=true ...)[^2],却错误地在 Windows 环境下也执行了这套逻辑。

既然暂时无法轻易修改插件源码,不如在系统层面“欺骗”它。我们可以编写一个 export.cmd 脚本放在 PATH 路径下(如 C:\WINDOWS\system32),模拟 Unix 的 export 行为。

新建 export.cmd 内容如下:

@echo off
REM export.cmd - 在 Windows 上模拟 Unix export 命令
REM 用法:export VAR1=value1 VAR2=value2 ...; command args

setlocal EnableDelayedExpansion

set "_INPUT=%*"
set "_TMPFILE=%TEMP%\_export_%RANDOM%.cmd"

echo @echo off > "!_TMPFILE!"
set "_FOUND_SEMI=0"

REM 简单的解析逻辑:分离环境变量与后续命令
for /f "tokens=1,* delims=;" %%A in ("!_INPUT!") do (
    set "_ENV_VARS=%%A"
    set "_COMMAND=%%B"
    if not "%%B"=="" set "_FOUND_SEMI=1"
)

REM 既然是模拟,重点在于不报错并执行后续命令
REM 这里将解析到的变量写入临时脚本
:parse_vars
if "!_ENV_VARS!"=="" goto execute
for /f "tokens=1,*" %%A in ("!_ENV_VARS!") do (
    set "_TOKEN=%%A"
    set "_ENV_VARS=%%B"
    echo !_TOKEN! | findstr "=" >nul 2>&1
    if !errorlevel!==0 (
        for /f "tokens=1,* delims==" %%K in ("!_TOKEN!") do (
            set "_KEY=%%K"
            set "_VAL=%%L"
            if "!_VAL!"=="''" set "_VAL="
            echo set "!_KEY!=!_VAL!" >> "!_TMPFILE!"
        )
    )
)
goto parse_vars

:execute
if !_FOUND_SEMI!==1 (
    REM 去除命令前的空格
    :trim_spaces
    if "!_COMMAND:~0,1!"==" " (
        set "_COMMAND=!_COMMAND:~1!"
        goto trim_spaces
    )
    if not "!_COMMAND!"=="" echo !_COMMAND! >> "!_TMPFILE!"
)

REM 执行生成的临时脚本并清理
endlocal
call "!_TMPFILE!"
del "!_TMPFILE!" 2>nul

这个脚本能简单解析 key=value 并执行分号后的命令。实测加上这个“补丁”后,Agent 终于能正常运行 git status 了。

[^1]: Windows11 下由 Windows Defender 造成的 C 语言代码编译运行卡顿 - Michael Song's Blog
[^2]: oh-my-opencode 源码中的 buildEnvPrefix 定义