跳过正文

从 npm 迁移到 pnpm

·1176 字

从复杂的混用开始
#

dsh 出的时候,用 bun 装的,但是 dsh plugin 命令替换的是 pnpm ,如果用 bun 管理插件会非常麻烦。之前还用 bun 装了 opencode ,一扫C盘发现node_modules里有9个opencode没绷住…😅这次彻底整理一下。听说 bun 被 a/ 收购了,以 a/ 的性子估计好不到哪去,所以索性删干净重装 bun 了。

npm、pnpm、bun 都有啥区别?
#

特性 / 维度npmpnpmBun
本质定位传统包管理器 (Node.js 默认)高效的包管理器JS/TS 运行时 + 工具链 (含包管理器)
安装速度较慢快 (全局缓存 + 硬链接)极快 (系统级 API 优化 + 二进制锁文件)
磁盘占用高 (每个项目重复下载)极低 (全局基于内容寻址的存储)极低 (支持全局缓存)
node_modules 结构扁平化结构 (容易引发幽灵依赖)软硬链接嵌套结构 (非扁平,但可兼容)扁平化结构
安全性/依赖隔离较弱极强 (禁止访问未声明的依赖)较弱 (机制同 npm)
适用场景传统老项目、不需要额外安装环境大中型项目、Monorepo 多包管理追求极速构建/新建原生 TS 项目
选型建议
  • 选 npm: 不想额外交外置工具、维护传统小型项目或新手入门
  • 选 pnpm: 团队协作、大型复杂项目、Monorepo 架构,或者磁盘空间紧张(目前生产环境最推荐
  • 选 Bun: 追求极致安装/构建速度、新建原生支持 TS 的服务、尝试全栈新生态

Agent 插件其实与本体无关
#

每个 ai agent 都有自己独自的插件管理体系,他需要啥就给他安装好啥包管理器就好了,交给 ai agent 自己的调用方式进行管理即可啦~

装个 pnpm
#

  • easy 一行命令
Invoke-WebRequest https://get.pnpm.io/install.ps1 -UseBasicParsing | Invoke-Expression
  • 修改 store & cache 路径到其他硬盘
pnpm config set store-dir "D:\your-path\pnpm-store" --global
pnpm config set cache-dir "D:\your-path\pnpm-cache" --global
# 读取当前设置
pnpm store path
pnpm config get cache-dir
  • (按需)修改全局 global bin 位置
pnpm config set global-dir      "D:\your-path\pnpm-global" --global
pnpm config set global-bin-dir  "D:\your-path\pnpm-global\bin" --global
pnpm config list                # 确认四个 key 都是 D:\ProgramData\pnpm\*
pnpm config get global-dir      # 单独验证
  • (无需)排除杀软
#管理员模式
Add-MpPreference -ExclusionPath $(pnpm store path)
  • 搞定!✅重启终端即可使用 pnpm
  • 查看pnpm已经安装的包
pnpm ls -g

先斩意中人 bun
#

接下来进行软件包的迁移: 一些环境变量记录:(均在D盘放着)

  • BUN_INSTALL_BIN
  • BUN_INSTALL_CACHE_DIR
  • BUN_INSTALL_GLOBAL_DIR

查看 bun 已经安装的包
#

bun pm ls -g

@cometix/codex
#

bun rm -g @cometix/codex
pnpm add -g @cometix/codex
pnpm ls -g # 查看已经全局安装的包

@opencode-ai
#

bun rm -g @opencode-ai
pnpm add -g @opencode-ai
pnpm ls -g # 查看已经全局安装的包

@deepseek-ai/dsh
#

dsh有点麻烦,对npm布局有要求

bun rm -g @deepseek-ai/dsh
pnpm add -g @deepseek-ai/dsh --config.node-linker=hoisted # 需要使用平铺包
# 需要允许编译 选 a 再 回车

dsh 的插件生态是基于 pnpm 的,使用 dsh plugin 命令即可:

dsh plugin --profile web add @linxin666/dsh-web-all@latest

插件还需要手动进行允许build,前往 ./dsh/pnpm-workspace.yaml 文件手动修改

再来迁移 npm
#

查看 npm 已经安装的包
#

npm ls -g --depth=0

@earendil-works/pi-coding-agent
#

npm uninstall -g @earendil-works/pi-coding-agent
pnpm add -g @earendil-works/pi-coding-agent
# 更新:pi update --self

pi 的插件生态是基于 npm 的,交给他自己就可以了

pi update --extensions        # 只升级插件包 + 对齐 git ref
pi update --all               # pi 本体 + 插件全量升级
pi update npm:pi-slopchop     # 升级单个包
pi update --models            # 刷新模型目录

加载新插件:pi install,与 npm/pnpm 无关

pi install npm:包名        # 最常见的 npm 包  (如 pi install npm:pi-something)
pi install npm:包名@1.2.3                # 锁定版本
pi install git:github.com/user/repo@main # git 仓库 + ref
pi install C:\path\to\package            # 本地路径
pi install -l <spec>      # 项目级(写 .pi\settings.json,团队共享,trust 后自动装)
pi remove <spec>                         # 卸载
Haley
作者
Haley