原因解释
先说明问题,我们在用命令行安装dsh插件时,会出现下面一个问题,我们这里演示一下
这里我们第一次安装插件时,没有出现问题,可以看见他已经成功安装了dsh插件
第二次安装插件时就会出现这个问题
报错翻译
ERR_PNPM_EPERM [importPackage C:\Users\博宇.薛.dsh\profiles\web\node_modules\js-yaml]
EPERM: operation not permitted,
rename 'C:\Users\博宇.薛.dsh\profiles\web\node_modules\js-yaml_tmp_28432_2'
-> 'C:\Users\博宇.薛.dsh\profiles\web\node_modules\js-yaml'
错误:pnpm 权限禁止。在导入包
js‑yaml的时候,不允许执行重命名操作。想要把临时文件夹js-yaml_tmp_28432_2,改名成正式包文件夹js-yaml,但是 Windows 拒绝了这个操作。
上面黄色警告 Issues with peer dependencies found 只是软警告,不是崩溃根源,可以忽略。真正让安装失败的是红色 EPERM。
发生过程(就是之前讲的 Defender 锁文件竞态问题)
- dsh/pnpm 下载插件 dshmarket 依赖,先创建临时文件夹:
js-yaml_tmp_28432_2 - 文件刚写入磁盘,Windows Defender 实时防护立刻扫描这个新文件夹
- Defender 打开了文件夹内的文件,占住文件锁
- pnpm 执行原子重命名,把临时文件夹改成正式名字
- Windows 规则:文件夹里面有文件被别的程序打开占用,禁止改名,直接抛出 EPERM 权限错误,插件安装失败。
这里博主让AI解释一下:
pnpm 完整安装流程(临时文件 + 重命名)
步骤
-
下载压缩包
-
解压到临时目录,名字形如:
js-yaml_tmp_28432_2 -
校验文件完整性、执行脚本
-
✅校验成功:原子重命名,
xxx_tmp→js‑yaml(正式文件夹名) -
❌校验失败:直接删掉临时文件夹,不会留下损坏文件
为什么先写到临时文件夹,而不是直接创建 js‑yaml?
核心目的:原子性安装(要么完全成功,要么一点都不生成)
如果你直接往 js-yaml 文件夹写入:
- 写到一半断电 / 程序崩溃 / 杀毒锁文件
- 磁盘上残留残缺、损坏、不完整的
js-yaml文件夹 - 下次项目启动就报各种各样诡异文件缺失错误。
原子操作思想:**只有全部文件解压 + 校验成功,才对外 “露出” 这个文件夹。**在重命名完成之前,你的项目完全看不见这个包。
为什么要用 rename(重命名)而不是复制文件?
Windows / Linux 操作系统特性:
- 文件夹重命名是极快、原子操作。几乎瞬间完成。
- 复制文件:需要读取‑写入全部文件,速度慢,中途随时可能中断。
pnpm 策略:
- 在旁边先建好一份完整、校验无误的副本 (tmp 文件夹)
- 一瞬间重命名切换到位。
不会出现 “一半文件新、一半文件旧” 的撕裂状态。
那为什么 Windows Defender 会把它搞崩?
时序冲突(竞态条件 Race‑Condition):
- pnpm 创建
js-yaml_tmp_28432_2,写入所有文件。 - 文件落地磁盘 → Windows Defender立刻触发实时扫描。
- Defender 进程打开了 tmp 文件夹里面的文件,拿到了文件句柄锁。
- pnpm 马上执行 rename。
- Windows 硬性规则:只要任意进程打开过文件夹内部文件,该文件夹就禁止重命名 / 删除。
- 操作系统返回 EPERM,操作被拒绝。安装失败。
重点:并不是杀毒软件判定病毒拦截。仅仅是文件被占用锁住。
总结:就是pnpm写临时文件以及该文件触发了电脑杀毒系统,电脑自动锁了该文件,pnpm操作不了该文件,也就无法将他绑定给dsh,插件自然也就没有办法安装
解决思路
1.直接关闭电脑的杀毒系统不太现实,但是我们可以修改一下,让电脑安全系统不监管我们目标的文件路径,或者让他放弃监控pnpm,这里博主就不再赘述,可以通过查询AI来获取到操作方法,让电脑安全系统放弃监控特定文件或者文件,以及软件。操作方法以及思路都是相通的,这里博主主要讲的是第二种情况
2.这里博主需要说一点,非常重要,就是你的本地电脑安全系统是会被覆盖的,就是实际执行杀毒的可能是你自己安装的第三方杀毒软件,此时电脑的安全系统会暂时关闭(博主的就是)
这里是博主关闭本地安装的第三方杀毒软件---火绒后,可以看见才看开启了本地电脑安全系统
同样,我们是可以通过cmd指令查询到我们当前电脑哪些杀毒系统在工作,那些在沉睡,如果安装了第三方杀毒软件,那么大概率运行的就是第三方杀毒软件,我们直接在软件中关闭特定文件查杀功能即可,下面博主拿火绒举例子
关闭电脑文件监控,这样就不会锁住我们的文件
也可以通过将我们的插件文件放置在信任区,这样火绒就不会监控到了
这里博主有进行了一次测试,可以看见插件可以正常安装到dsh,问题解决
后续问题
dsh在安装插件啥的会出现各种各样的问题,博主也只是提供了其中一种场景的解决思路,也是博主测试了很多次,查询各种资料才想到的可能出错的地方。博主不能保证是不是完全是这个原因,也是尽可能梳理错误的来龙去脉,但是实际执行下来,博主也是能够安装插件,也是分享的一个解决思路