dsh插件重复安装失败解决思路

181 阅读5分钟

原因解释

先说明问题,我们在用命令行安装dsh插件时,会出现下面一个问题,我们这里演示一下

image.png

这里我们第一次安装插件时,没有出现问题,可以看见他已经成功安装了dsh插件

image.png

第二次安装插件时就会出现这个问题

报错翻译

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 锁文件竞态问题)

  1. dsh/pnpm 下载插件 dshmarket 依赖,先创建临时文件夹:js-yaml_tmp_28432_2
  2. 文件刚写入磁盘,Windows Defender 实时防护立刻扫描这个新文件夹
  3. Defender 打开了文件夹内的文件,占住文件锁
  4. pnpm 执行原子重命名,把临时文件夹改成正式名字
  5. Windows 规则:文件夹里面有文件被别的程序打开占用,禁止改名,直接抛出 EPERM 权限错误,插件安装失败。

这里博主让AI解释一下:

pnpm 完整安装流程(临时文件 + 重命名)

步骤

  1. 下载压缩包

  2. 解压到临时目录,名字形如:js-yaml_tmp_28432_2

  3. 校验文件完整性、执行脚本

  4. ✅校验成功:原子重命名,xxx_tmp → js‑yaml(正式文件夹名)

  5. ❌校验失败:直接删掉临时文件夹,不会留下损坏文件

为什么先写到临时文件夹,而不是直接创建 js‑yaml?

核心目的:原子性安装(要么完全成功,要么一点都不生成)

如果你直接往 js-yaml 文件夹写入:

  • 写到一半断电 / 程序崩溃 / 杀毒锁文件
  • 磁盘上残留残缺、损坏、不完整的 js-yaml 文件夹
  • 下次项目启动就报各种各样诡异文件缺失错误。

原子操作思想:**只有全部文件解压 + 校验成功,才对外 “露出” 这个文件夹。**在重命名完成之前,你的项目完全看不见这个包。

为什么要用 rename(重命名)而不是复制文件?

Windows / Linux 操作系统特性:

  • 文件夹重命名是极快、原子操作。几乎瞬间完成。
  • 复制文件:需要读取‑写入全部文件,速度慢,中途随时可能中断。

pnpm 策略:

  1. 在旁边先建好一份完整、校验无误的副本 (tmp 文件夹)
  2. 一瞬间重命名切换到位。

不会出现 “一半文件新、一半文件旧” 的撕裂状态。

那为什么 Windows Defender 会把它搞崩?

时序冲突(竞态条件 Race‑Condition):

  1. pnpm 创建 js-yaml_tmp_28432_2,写入所有文件。
  2. 文件落地磁盘 → Windows Defender立刻触发实时扫描。
  3. Defender 进程打开了 tmp 文件夹里面的文件,拿到了文件句柄锁。
  4. pnpm 马上执行 rename。
  5. Windows 硬性规则:只要任意进程打开过文件夹内部文件,该文件夹就禁止重命名 / 删除。
  6. 操作系统返回 EPERM,操作被拒绝。安装失败。

重点:并不是杀毒软件判定病毒拦截。仅仅是文件被占用锁住。

总结:就是pnpm写临时文件以及该文件触发了电脑杀毒系统,电脑自动锁了该文件,pnpm操作不了该文件,也就无法将他绑定给dsh,插件自然也就没有办法安装

解决思路

1.直接关闭电脑的杀毒系统不太现实,但是我们可以修改一下,让电脑安全系统不监管我们目标的文件路径,或者让他放弃监控pnpm,这里博主就不再赘述,可以通过查询AI来获取到操作方法,让电脑安全系统放弃监控特定文件或者文件,以及软件。操作方法以及思路都是相通的,这里博主主要讲的是第二种情况
2.这里博主需要说一点,非常重要,就是你的本地电脑安全系统是会被覆盖的,就是实际执行杀毒的可能是你自己安装的第三方杀毒软件,此时电脑的安全系统会暂时关闭(博主的就是)

image.png

image.png

这里是博主关闭本地安装的第三方杀毒软件---火绒后,可以看见才看开启了本地电脑安全系统

同样,我们是可以通过cmd指令查询到我们当前电脑哪些杀毒系统在工作,那些在沉睡,如果安装了第三方杀毒软件,那么大概率运行的就是第三方杀毒软件,我们直接在软件中关闭特定文件查杀功能即可,下面博主拿火绒举例子

image.png

关闭电脑文件监控,这样就不会锁住我们的文件

image.png

也可以通过将我们的插件文件放置在信任区,这样火绒就不会监控到了

image.png

这里博主有进行了一次测试,可以看见插件可以正常安装到dsh,问题解决

后续问题

dsh在安装插件啥的会出现各种各样的问题,博主也只是提供了其中一种场景的解决思路,也是博主测试了很多次,查询各种资料才想到的可能出错的地方。博主不能保证是不是完全是这个原因,也是尽可能梳理错误的来龙去脉,但是实际执行下来,博主也是能够安装插件,也是分享的一个解决思路