内网离线怎么装 DSH plugin?DeepSeek Harness 插件市场的 tarball 拷入与离线安装步骤
内网首次离线安装 DSH plugin(中文也常写作 DSH插件、DeepSeek插件),难点不在命令而在「包从哪来」和「依赖怎么补齐」:先在联网机器上把插件的 tgz 备好,必要时把依赖一并带进来,再在目标机执行 dsh plugin --profile web add ./<包名>-<版本>.tgz,最后用 list 与 profile 的 node_modules 两处校验(来源)。
DSH plugin 离线安装与在线安装差在哪:只换了「取包」这一步
在线安装是让 pnpm 去 registry 取包;离线安装把「取包」搬到有网的机器上单独完成,内网只做「装包」——两者落点完全相同,都是 $DSH_HOME/profiles/<名字>(来源)。 所以整条链路只有两问:
- 包从哪来:作者发布的 tarball、自己
pnpm pack打的 tgz、或私有 registry; - 装到哪去:
dsh plugin --profile <名字> add <本地路径>,目录必须写准。
先分清对象:本体的离线安装与插件的离线安装是两条不同的路,前者见《内网、离线环境怎么装 dsh?》,本篇只讲还没装过任何插件的机器怎么把第一个 DSH plugin 装进去。如果插件已经装过、只想换新版,走的是《内网离线怎么更新 dsh plugin》。
第一步:在联网机器上把 DSH plugin 包备好
内网拿不到公共 registry,插件包就必须先在联网环境准备好,并且要提前考虑依赖(来源)。 三条取包途径:
- 直接搬作者发布的 tarball——最省事,
add的目标本来就允许写.tgz路径,作者打好的发布物搬进来即可。 - 在联网机器上自己打一份——源码在你手上时用这条:
# 联网机器:进入插件源码目录后打包
pnpm pack
# → dsh-hello-plugin-0.2.0.tgz
注意打包顺序:pnpm pack 只把产物收进压缩包,prepare 这类构建脚本必须先在联网机器上跑完,否则搬进去的是一个缺产物的空壳。
- 走私有 registry——内网有 Verdaccio 之类私有源时,把插件与依赖都发到内网源,内网端照常写包名安装,这条路额外解决了依赖问题。
最容易踩的一点:tgz 里只有插件本体。首次安装时 profile 里还没有任何依赖,pnpm 必须去 registry 解析它们——完全断网时会在解析阶段就失败。两条出路:内网搭私有源兜住依赖,或把依赖也逐个 pnpm pack 带进来、先装依赖再装插件。

第二步:把 DSH plugin 包拷进目标机并定位 profile
拷贝环节本身没有讲究,tgz 放临时目录也行;真正要定死的是装进哪个 profile(来源)。 三步:
- 确认根目录 — 执行
echo $DSH_HOME。预期:有输出按这个值走,没有输出就是默认的~/.dsh。 - 列出已有 profile — 执行
ls "$DSH_HOME/profiles"。预期:看到web、headless,内网机器上往往还有自建的 profile,别装错,细节见《多个 profile 装同一个 dsh plugin》。 - 核对插件名与版本 — 在联网侧打开 DSH Plugin Hub 的设置 → 插件市场,在卡片上确认插件名、作者与目标版本号。预期:搬进来的 tgz 与市场里核对到的对得上,避免拿错包。
第三步:离线 add 安装 DSH plugin 与校验
装包就是对新版 tgz 跑一次 add:dsh plugin --profile web add ./<包名>-<版本>.tgz,pnpm 会把它写进该 profile 的依赖并落到 node_modules。 四步确认:
- 执行安装命令 — 在 tgz 所在目录执行
dsh plugin --profile web add ./hello-plugin-0.2.0.tgz。预期:命令进入安装流程,不报「找不到包」;报解析失败就是依赖没带齐,回第一步补。 - 列已装插件 — 执行
dsh plugin --profile web list。预期:输出里出现该插件及其版本号。 - 看依赖记录 — 打开
$DSH_HOME/profiles/web/package.json。预期:插件作为普通依赖写在dependencies里。 - 看落盘位置 — 查看
$DSH_HOME/profiles/web/node_modules。预期:顶层目录名对应插件包名,真实文件在.pnpm虚拟存储里,细节见《DSH plugin 装在哪个目录》。

插件市场在内网里依然可以打开,用来核对插件名与版本,但它不提供包源——离线安装必须走本地路径。
内网离线装 DSH plugin 的注意事项与局限
- 依赖是最大的坑:tgz 只含插件本体,首次安装时 profile 没有依赖可解析,断网必失败;要么上私有源,要么把依赖打包一起带。
- 打包前先构建:
pnpm pack不跑构建脚本,缺产物的包装上了也会在加载阶段报错。 --profile必填且无短写:内网机器多 profile,装错目录插件等于没装。- 校验要看三处:命令退成 0 不等于生效,
list、package.json、node_modules三处一致才算装到位。 - 装坏了的回退方式:重新
add一份正确的 tgz 即可覆盖;动手前整目录备份 profile 更稳。
把第一个插件装进去之后,后续更新可以复用同一套 tgz 搬运流程。DSH Plugin Hub 既是插件市场也是管理界面,用于核对版本与查看已安装列表。
来源:dsh CLI README(官方仓库)、打包与安装插件(官方文档)、dshplugin/dsh-plugin-hub
常见问题
**内网连不上 npm 时,第一次装 DSH plugin 要先把包装成 tgz 搬进来,再用本地路径安装**。在联网机器上拿到插件的 tarball(作者发布的或自己 pnpm pack 的),拷进内网后执行 dsh plugin --profile web add ./<包名>-<版本>.tgz。dsh plugin add 的目标本来就可以写本地路径,所以首次安装与在线安装的落点完全相同。
**离线装 DSH plugin 时依赖装不上,是因为 tgz 里只有插件本体,传递依赖还要靠 pnpm 去 registry 解析**。完全断网时,只要该插件引入了 profile 里没有的依赖,安装就会在解析阶段失败。两条出路:在内网搭一个私有 registry 兜住依赖,或把依赖也逐个打包带进来先装依赖再装插件。
**离线环境里 DSH plugin 的插件市场仍能打开,但它本身不提供包源**。内网里只要本体与目录接口可达,插件市场就能打开并用于核对插件名、作者与版本号,帮助你在联网侧确认该搬哪一个 tgz;但点「安装」仍要能取到包,断网时这一步会失败,得改用本地路径安装。
**离线装 DSH plugin 时 tgz 放哪都行,安装目标目录不能随便**。拷贝过去的 tgz 只是安装来源,放在临时目录也无妨;真正决定插件去向的是 --profile 参数,它对应 $DSH_HOME/profiles/<名字>。内网常有多个 profile,装错目录等于白忙。
**确认离线装好的 DSH plugin 生效,要三处一起看才算装到位**。执行 dsh plugin --profile web list 看输出里有没有该插件及其版本;打开 profile 的 package.json 确认依赖条目已写入;再进 $DSH_HOME/profiles/web/node_modules 看顶层目录名是否对得上。只看命令退出码不足以判断。
相关术语
- tarball(tgz)
- tarball 是 npm 生态的包压缩格式,扩展名为 .tgz,内容为构建产物加 package.json。dsh plugin add 的目标允许写本地 tgz 路径,因此它天然适合把插件搬进没有公共 registry 的内网环境。— dsh CLI README
- pnpm pack
- pnpm pack 是在包目录里生成 tgz 的命令,产物与发布到 registry 的内容一致。它只打包产物,prepare 之类的构建步骤需要在打包前单独执行,否则包里会缺文件。— DeepSeek Harness 官方文档 - 打包与安装插件
- 传递依赖
- 传递依赖是插件依赖的依赖,不会写进插件自己的 tgz 里。离线首次安装时,profile 中尚无这些包,pnpm 必须去 registry 解析它们——这是离线安装最容易失败的一步。— dsh CLI README
- 私有 registry
- 私有 registry 是部署在内网、供受控环境使用的包源,形态类似 Verdaccio。把它配到 profile 的 npm 配置后,内网端可照常写包名安装,由内网源同时提供插件与它需要的依赖。— dsh CLI README
来源
- dsh CLI README· deepseek-ai
- DeepSeek Harness 官方文档 - 打包与安装插件· deepseek-harness
- dshplugin/dsh-plugin-hub GitHub 仓库· GitHub