@dsh-so/dshvm
v0.2.0
Published
Unofficial, zero-dependency multi-version manager for the DeepSeek Harness CLI (dsh): install from npm, GitHub or local, switch in a second, with optional per-version data isolation.
Maintainers
Readme
装上它,你机器上的 dsh 就有了一位「小管家」:想试新版本就装,想留老版本就留,dshvm use 一句话切过去,不必 npm install -g 来回覆盖;跨越会话格式里程碑的升级它替你把着关;测试新版本还可以一人一份数据、互不污染。从「想装个新版本」到「已经在跑」,不离开一条命令(或一次点击)。
这是什么?
一句话:给 dsh 配一个 nvm 式的版本管理器。
没有它,你想同时留两个 dsh 版本,得手动 npm install -g 来回覆盖、自己备份 ~/.dsh,升级前还要祈祷会话数据别被新格式弄坏。有了它,这些全变成一句话的事 —— dshvm 把 dsh 的版本与数据拆开来管:
- 版本装进各自的槽位
~/.dsh-versions/dsh-<id>/,全局dsh只是一层极薄的连接器 —— 读指针,转发给激活版本的 bin; - 数据默认共享一个
$DSH_HOME,需要时dshvm isolate一条命令切成每版本一份。
举个例子:dshvm install 0.1.5-rc.3 把版本装进独立槽位(npm 上没有的版本自动回退到 DSH GitHub 仓库源码构建),dshvm use 0.1.5-rc.3 一切 —— 全局 dsh 立刻就是它;老版本原封不动躺在槽位里,一条命令切回来。
30 秒上手
- 装 ——
npm install -g @dsh-so/dshvm - 接管 ——
dshvm setup(收编你现有的全局dsh、装上连接器;此后dsh由 dshvm 接管,随时可切) - 切 ——
dshvm install <版本>+dshvm use <版本>,随时来回
其他渠道(本地 checkout、升级、卸载)见下方安装。不想敲命令,直接跳到图形界面。
管起来长什么样?
$ dshvm list
home: C:\Users\zhoushimin\.dsh-versions
0.1.2-rc.1 [npm-global] OK
0.1.5-rc.3 [store] OK
* 0.1.7-rc.1 [store] OK
$ dshvm use 0.1.5-rc.3
dsh -> 0.1.5-rc.3
$ dsh --version
0.1.5-rc.3(真实输出有删节 —— 每个版本下面还列着它 bin 的完整路径。* 标当前激活;[npm-global] / [store] / [gh-source] / [local] 是版本来源徽章。)
常见使用场景
四个最常见的活法 —— 每个都给命令行与界面两条路。
1 · 安全尝鲜新版:不动你正在用的环境(隔离拷贝升级)
dshvm isolate 0.1.3-alpha.1 --copy # 拷贝现有 ~/.dsh 后转为独立
dshvm use 0.1.3-alpha.1 # 激活这份独立副本你的会话、插件、配置照常可用 —— 新版本在自己那份数据里折腾,升级永远不会污染你正在用的环境。 界面里:「已安装」页该版本行 ⋯ → 隔离(拷贝现有数据) → 行内「启动」(细节见隔离数据:三种玩法)。
2 · 日常多版本管理
dshvm install 0.1.2-rc.1 # 正常安装
dshvm use 0.1.2-rc.1 # 切换;和所有版本一样共享默认 ~/.dsh界面里:「可安装」页点「安装」,再 ⋯ → 设为默认;或直接行内「启动」临时跑一次。
3 · 完全隔离的测试环境
dshvm isolate 0.1.3-alpha.1 # 全新、空白的 $DSH_HOME——不拷贝任何东西,不影响任何现有数据
dshvm use 0.1.3-alpha.1在"干净房间"里测试插件 / profiles / 会话,不会向共享数据泄漏任何东西。 界面里:该版本行 ⋯ → 隔离(空白环境) → 「启动」。
4 · 随时回退、去掉隔离、清理收尾
dshvm use 0.1.2-rc.1 # 回到共享 ~/.dsh 和旧版本
dshvm unisolate 0.1.3-alpha.1 # 删掉该版本的隔离副本
dshvm remove 0.1.2-rc.1 # 用完了就删槽位(含其隔离数据)界面里:切回旧版本 = 行内「启动」或 ⋯ → 设为默认;⋯ → 取消隔离 删隔离副本;⋯ → 移除… 删槽位(弹确认框,不可撤销)。
它是怎么工作的?
dsh(连接器)-> 读 ~/.dsh-versions/current-bin.txt -> node <激活 bin>
~/.dsh-versions/versions.json = 版本 -> { bin, kind, realVersion }
~/.dsh-versions/active.txt = 激活版本 ID几个你可能关心的点:
- 不 fork、不改上游 —— 连接器(
dsh.cmd/dsh.ps1/dsh)是极薄转发器,只读指针、转发给激活版本的 bin;bin 路径来自各包package.json的bin字段。装哪个版本,跑的就是哪个版本的原样代码。 - 切换零下载、离线可用 —— 版本只装一次进槽位,
use只是改指针。 - 代码与数据是两层 —— 槽位
~/.dsh-versions/dsh-<id>/只放 dsh 的代码(bin + 它自己的node_modules);插件、profiles、会话、配置、skills、附件、凭证都在$DSH_HOME(默认~/.dsh),插件不在槽位里。 - 不打扰运行中的会话 ——
use只影响新启动的dsh,已运行的进程保持原版本。 - 每个版本自己解析依赖 —— 依赖从槽位自己的
node_modules解析;源码槽位在槽内构建,workspace 链接保持有效。 - npm 上没有的版本也能装 —— 自动回退到 DSH GitHub 仓库源码构建,见安装来源。
会弄坏我现有的数据吗?不会。
dshvm 管版本,但把你数据的安全当头等大事 —— 三道防线:
第一道:升级跨不过会话格式里程碑。 dsh 在下列版本变更了会话格式,新版首次运行会自动迁移 ~/.dsh 里的数据。直接跳过某个里程碑升级(如 0.1.2 → 0.1.5-alpha.1),新 dsh 读不到中间格式、可能把旧会话数据破坏且无法恢复 —— dshvm 会在关键节点拦下:
| 里程碑版本 | 会话格式 |
| --- | --- |
| 0.1.3-alpha.1 | v2 |
| 0.1.5-alpha.1 | v3 |
dshvm install/dshvm use命中跨越里程碑的升级时,打印醒目的双语警告;- dshvm-ui 的「设为默认」会弹确认框,列出被跳过的节点和迁移步骤 —— 逐版本升:先装并切到
0.1.3-alpha.1、运行一次 dsh 完成迁移,再继续往上升。
第二道:降级也提醒。 主目录已被超过 0.1.6-alpha.1 的版本使用过、又要往旧版本装时,dshvm install 会给出三句提醒:先关掉这个环境里的 beta 功能(experimental / profile bundle 等);旧版读不了新版写入的会话;拿不准就 dshvm isolate <版本> --copy 隔离拷贝着跑。
第三道:一份数据只让一个实例写。 dsh 目前只有进程内单写者,共享 ~/.dsh 的第二个 web 实例打不开活动会话(SessionAlreadyOwnedError)。dshvm-ui 启动前会先拦下并弹确认框:可选「仍然启动」,或「隔离并启动」—— 先给该版本一份独立数据目录再启动。
隔离数据:三种玩法
所有版本默认共享一个 $DSH_HOME(插件、profiles、会话、配置、凭证全在里面)。想分开时,isolate 给某个版本一份独立的 —— 三种场景,先看图:
| 场景 | 命令 | 说明 |
| --- | --- | --- |
| 隔离拷贝升级 —— 保留现有会话/数据,新版本独立运行 | dshvm isolate <version> --copy | 把共享 ~/.dsh 拷进该版本自己的数据,升级不会污染你在用的会话环境 |
| 多版本管理,正常升级 | dshvm install <version> | 正常安装,和所有版本一样共享默认 ~/.dsh |
| 完全隔离环境测试 | dshvm isolate <version> | 一个全新、空白的 $DSH_HOME —— 不拷贝任何东西、不影响任何现有数据 |
dshvm isolate 0.1.5-rc.3 # A. 该版本全新、空白的 $DSH_HOME,再 use 激活它
dshvm isolate 0.1.5-rc.3 --copy # C. 先拷贝你的共享 ~/.dsh,再转为独立
dshvm unisolate 0.1.5-rc.3 # E. 删掉隔离副本,回到共享 ~/.dsh两个容易疑惑的点:
isolate之后,dshvm use <version>会自动把该版本指向它自己的$DSH_HOME;插件会落到它自己的 profiles 目录,里面建的会话/配置不会泄漏到共享~/.dsh或其它版本。- 隔离状态存在磁盘上(
~/.dsh-versions/active-data.txt+isolate/<id>/),跨终端、重启仍生效 —— 但它不是 shell 环境变量:echo $DSH_HOME是空的,是连接器在dsh进程内注入的。查看:cat ~/.dsh-versions/active-data.txt。
命令
| 命令 | 作用 |
| --- | --- |
| dshvm list | 列出已注册版本。 |
| dshvm use <version> | 切换全局 dsh(支持前缀匹配)。 |
| dshvm install <source> | 安装版本 —— 见安装来源。 |
| dshvm register <version> <path> | 按现状登记包根或 bin(不构建)。 |
| dshvm unregister <version> | 删除注册表条目(激活项需 --force)。 |
| dshvm remove <version> | 删除槽位 + 注册表条目(含隔离数据)。 |
| dshvm isolate <version> [--copy] | 给版本建全新独立 ~/.dsh;--copy 从共享播种。 |
| dshvm unisolate <version> | 去掉隔离副本,回到共享 ~/.dsh。 |
| dshvm exec [args] | 启动激活的 dsh(连接器用);自动适配 web 端口。 |
| dshvm upgrade [--check] | 把 dshvm 自身升到 npm 最新版;--check 只检查不安装。 |
| dshvm setup / repair / doctor | 首次设置 / 自愈连接器 / 体检。 |
| dshvm current / which [v] | 查看激活版本 / 某版本 bin 路径。 |
| dshvm plugin <子命令> | 插件小管家 —— 装/升/卸插件、搜 dsh.so 目录、装场景包,见下表。 |
dshvm plugin:插件小管家
| 子命令 | 作用 |
| --- | --- |
| dshvm plugin scan | 扫描各 profile 已安装的插件。 |
| dshvm plugin add <spec> [--smart] | 安装插件;--smart 先在沙箱副本试装,验证通过再正式装。 |
| dshvm plugin upgrade <id> [--all] | 升级一个 / 全部插件。 |
| dshvm plugin remove <id> | 卸载插件。 |
| dshvm plugin library [id] | 搜 dsh.so 插件目录与榜单:--search / --sort stars\|downloads\|popular\|surge\|surge-downloads\|new / --kind / --level / --limit / --offset;带 id 看详情(含 dsh.so 验证记录)。 |
| dshvm plugin pack list / show <id> / install <id> | 场景包:列出 / 看曲目清单 / 一键安装整包到 --profile。 |
| dshvm plugin approve-builds <pkg> --profile <p> | 放行上次安装被忽略的包安装脚本后重跑安装。 |
| dshvm plugin report export | 导出安装报表。 |
安装来源
dshvm install <source> 安装一个 dsh 版本:
| 来源 | 示例 |
| --- | --- |
| npm 注册表(@deepseek-ai/dsh) | dshvm install 0.1.2-rc.1 · npm:alpha |
| GitHub 仓库,自动 | dshvm install github:deepseek-ai/deepseek-harness · .../#dsh-v0.1.3-alpha.1 · 任意 https://github.com/... |
| GitHub 发布资产 | gh-release:<o/r>[@tag][#asset] |
| 强制源码 | gh:<o/r>[@ref][#subpath] |
| 本地源码 / tarball | dshvm install E:\src\deepseek-harness · ./pkg.tgz |
自动回退 —— 裸版本号 dshvm install <version> 会自动重试:若 <version> 不在 npm 上,就从 github:deepseek-ai/deepseek-harness#dsh-v<version> 源码构建(CLI 包用 #apps/cli 钉位)。所以 dshvm install 0.1.3-alpha.1 即便没发到 npm 也能装。
- 选项:
--as <id>改注册版本 ID;--bin <name>为多 bin 包选 bin;GITHUB_TOKEN/GH_TOKEN提升 GitHub 限速(也能访问私有仓库)。 - GitHub 源码树解压会跳过 Windows
tar无法创建的条目(符号链接)并给警告;若构建需要读取 git 元数据,dshvm 会先加一个单提交快照,使 tarball 也能构建。
图形界面(dshvm-ui)
本节整节都是图形界面用法;只用命令行的话,可跳过本节直接看30 秒上手,之后的「命令」等章节也都只涉及 CLI。开发构建、架构与排障见 ui/README.md。
不想敲命令时,用同仓库的桌面启动器 鲸世启动器(dshvm-ui,Tauri 2 + React)。左侧两个入口管完全部:「启动」管版本与实例,「插件」管插件中心;顶栏换皮肤、检查更新,点 ✕ 最小化到托盘,web 实例照常后台跑。底层原则与 CLI 同源:只读状态直读 ~/.dsh-versions(DSHVM_HOME 可覆盖),所有变更操作一律转给 dshvm CLI —— 界面和命令行看到的永远是同一份事实。
获取与首次启动
| 渠道 | 内容 |
| --- | --- |
| NSIS 安装器 | dshvm-ui_*_x64-setup.exe;机器上已有 Node/npm 时自动执行 npm install -g @dsh-so/dshvm + dshvm setup |
| MSI | 纯应用安装(不含上述自动化) |
| 源码构建 | 需 Tauri 2 + Rust 工具链 + WebView2,见 ui/README.md |
安装包随 GitHub Releases 发布;某个 Release 还没附二进制时,按 ui/README.md 从源码构建。
打开后若检测到 dshvm 未安装,会先进引导页而非主界面,按提示补环境即可:
- 引导页列出 Node.js / npm / dshvm 三项检测结果;缺 Node.js 时可一键下载并运行 Node 官方 LTS 安装器(装完点「重新检测」,必要时重启应用);
- Node/npm 就绪后点**「一键安装 dshvm」**:等于执行
npm install -g @dsh-so/dshvm+dshvm setup,npm 输出实时滚动在页面上; - 用 NSIS 安装器装的应用在已有 Node 的机器上已自动做完这一步,打开即是主界面。
管理已安装版本
「已安装」页每个版本一行:●/○ 标出默认,来源徽章(store / npm-global / gh-source / local),以及 默认、🔒隔离、副本(隔离数据拷贝自共享目录)标记。行内「启动」直接拉起该版本的 web;行内 ⋯ 菜单:
| 操作 | 行为 |
| --- | --- |
| 设为默认 | 等于 dshvm use <id>,全局 dsh 立即改指(跨越会话格式里程碑会先弹确认框) |
| 隔离(空白环境) | dshvm isolate <id>:给该版本一个独立的空 $DSH_HOME |
| 隔离(拷贝现有数据) | dshvm isolate --copy:把共享 ~/.dsh 复制一份过去,行内多一枚「副本」标 |
| 取消隔离 | dshvm unisolate <id>:回到共享数据 |
| 移除… | 弹确认框:删除代码槽 + 注册信息 + 隔离数据目录,不可撤销;若移除的是默认版本,额外警告「默认会被清空,重新指定前 dsh 无法运行」 |
| 复制 bin 路径 | 该版本 bin 的绝对路径进剪贴板 |
两个指针不一致时(active.txt 与 current-bin.txt 指向不同),底栏会提示「激活指针不一致」。
安装新版本
入口:「已安装」页底部的 + 安装新版本,或「可安装」页每行的 安装。
- 「可安装」列表合并 npm registry(走你自己的 npm,跟随你的镜像/代理配置)与 DSH GitHub tags,结果本地缓存 1 小时,↻ 刷新强制拉最新;某个源取不到时明确提示"结果可能不完整"。首行 ⭐ 推荐版本 即 npm 的
latest;alpha/beta 默认折叠在「更多」里,勾选「显示 alpha/beta 预发布版」展开(rc 直接可见)。 - 安装对话框接受裸版本号 /
npm:x/github:owner/repo#ref/ 本地路径,并附三个快捷标签(npm latest / npm 指定版本 / GitHub tag)。过程分阶段显示(解析版本 → npm 下载安装 → 注册版本…)并计时;npm 警告折叠计数;失败时给出退出码、日志末尾原文与「复制日志」,安装中随时可取消。 - 安装从不改动当前默认版本,装完需要 ⋯ → 设为默认 切过去。
启动 dsh web 与实例管理
每行的「启动」按钮拉起该版本的 web。启动在后台做的事:从 3080 起找成对空闲的端口(dsh 同时占 127.0.0.1:N 和 0.0.0.0:N+1)→ 先建日志 ~/.dsh-versions/logs/<版本>-<UTC时间戳>.log(每版本保留 10 份),之后任何失败(版本未知 / bin 损坏 / 端口耗尽)都会把原因写进去 → 启动 node <bin> web --port N --no-open,隔离版本注入自己的 DSH_HOME → 等待就绪(最多 15 秒)→ 捕获 dsh 打印的 http://127.0.0.1:N/?token=… 并用它打开浏览器。登录 token 只在启动时打印一次,由 UI 代管。
运行中的实例列在下方「运行中」面板,每行 日志 / 打开 / ↻ 重启 / ■ 停止:
- 重启是让插件生效的开关 ——
dsh web只在启动时读一次 profiles,刚装的插件重启后才出现。重启会先停掉实例、等端口对释放(最多 5 秒,防止新实例落到别的端口让你对着一串死链),再按同一版本重新拉起。 - 手动启动(外部)实例也能看到(扫描
netstat与 node 命令行发现)、可以停止;但它的 token 本应用拿不到,「打开」给不了带 token 的地址,「重启」也禁用(拿不到它的数据目录指向)——想要全功能,让 dshvm-ui 自己启动。 - 面板列表每 3 秒刷新;外部实例启动时立即扫一次、之后每 60 秒扫一次;进程一停,对应行自动消失;点「停止」该行立即移除,不等扫描。
启动失败不静默:「启动状态」区为每次未成功的启动保留一行 —— 启动中… / 启动失败 / 已拦下,带原因(悬停看全文)、日志(失败的启动必有一份)、重试;底栏同步显示完整错误详情。共用数据目录守卫:启动未隔离版本而另一实例正占用 ~/.dsh 时会先拦下弹确认框,可选「仍然启动」或「隔离并启动」。
插件中心:发现、试装、一键整包
侧栏「插件」进插件中心,三个页签,数据全部经 dshvm plugin CLI 取得。
编辑推荐 —— dsh.so 的场景包专辑墙(编辑精选、开发者工作台、创意视觉、财务运营、学生学习、老师教学、写作长文、研究文献…),每个专辑是一组搭配好的插件:
点开专辑看完整清单,每个条目带中英双语推荐理由、dsh.so 验证等级(L1 收录 → L4 装得上 → L5 跑得通)、风险等级、星数与下载量;选好 profile 点**「一键安装」**把整包装进指定 profile,没发布安装命令的条目自动跳过、不拖垮整包:
我的插件 —— 「我的安装」按 profile 分组列出已装插件(web 组在最前),每行 升级 / 日志 / 卸载;顶部输入框按 spec 装插件(dsh-ppt、@xmanrui/dsh-im、github:o/r 均可),**「一键升级」**把所有 profile 的所有插件升到最新。「我的收藏」存你点过红心的插件,不在当前页也能装:
发现插件 —— 整个 dsh.so 插件目录装进界面:七个榜 —— 所有 / ★ 星标榜 / ⬇ 周下载榜 / 🏅 总下载榜 / ↗ 星标飙升 / ⬇↗ 下载飙升 / ✦ 新上架,配「全部 / 仅插件 / 仅生态应用」类型过滤、目录搜索、卡片/列表两种视图(右上角切换、记忆选择)与翻页器(榜单固定前 100,「所有」与搜索可翻页)。星标飙升、周下载、总下载三榜直连 dsh.so/data 官方每日快照,官方不可达时退回本地积累的快照兜底:
点任何卡片弹出详情:dsh.so 的验证记录(在哪个 dsh 版本上验证通过、何时)、官方发布的安装命令(一键复制,绝不替你拼装)、GitHub 仓库与 dsh.so 外链(外链走白名单校验,只放行 dsh.so 与 github.com):
点「安装」走沙箱试装,整条链路看图:
安装/升级/卸载的逐行输出共享一个日志面板;dsh.so 已实测可运行的 L5 生态应用按记录跳过试装直接装;勾「跳过试安装」可走直达车道。
体检与修复
「启动」页的修复中心把 dshvm doctor 的体检结果列成一张清单:体检时间 + 正常/警告/失败计数,逐项 ✓ / ⚠ / ✗ 与「建议:…」,明细可展开看条目,底部「原始体检报告」可展开完整 JSON。体检覆盖两半:本地半边(版本注册表、指针一致性、每个已注册版本、隔离数据、三个 shim、数据目录)与 dsh 半边(Node 运行时、默认 preset、profile 模块链接、persona 字段、日志分诊、启动/TLS 探针等),外加安装树完整性、koffi 原生模块、运行中的实例等升级风险项。
「一键修复」是真的会修东西:跑 dshvm doctor --fix(失效模块链接移进隔离区、迁移改名的 preset/persona,每项修复后自查),再补一次 shims 与指针重装,最后复检、按条目报数(「已修复 N 项,剩余 M 项」),每一步都有回音。
设置、更新与托盘
右上角 ⚙ 打开设置:
- 界面语言 —— 中文 / English,即点即切;横幅皮肤 —— 海岛场景 / 鲸鱼娘两种顶栏横幅随你换;
- npm 镜像 —— 官方 / 淘宝 / 腾讯云 / 华为云 / 自定义,保存后对之后启动的安装进程生效;
- 退出时停止所有 web 实例 —— 默认关闭:点窗口 ✕ 是最小化到托盘(左键托盘图标恢复,托盘菜单「退出」才真退出),web 实例照常在后台跑;
- 检查更新 —— 应用启动几秒后也会静默检查一次(无更新、离线都不打扰),发现新版弹窗展示版本号与更新说明,下载带进度、完成后自动重启安装;更新包经签名校验,以 GitHub Releases 的
latest.json为更新源。
所有设置与偏好(语言、皮肤、视图、收藏、镜像……)持久化在 ~/.dsh-versions/ui-settings.json。
安装
| 渠道 | 命令 | 说明 |
| --- | --- | --- |
| npm(推荐) | npm install -g @dsh-so/dshvm | 发布版,零运行时依赖 |
| 本地 checkout | npm install -g --force <path> | 发布前从源码自测;--force 用于覆盖同名全局包 |
npm install -g @dsh-so/dshvm
dshvm setupsetup 会收编你现有的全局 dsh、安装 dshvm 连接器,并把激活版本指向它。此后 dsh 由 dshvm 接管,随时可以 dshvm use 切到别的版本。
环境:Node.js ≥ 18(装 dshvm 要它,跑 dsh 也要它)+ npm;从 GitHub 源码装 dsh 版本还要 tar,git 仅当某个构建需要读取 git 元数据时使用。
环境变量
| 变量 | 含义 | 默认 |
| --- | --- | --- |
| DSHVM_HOME | 版本主目录。 | ~/.dsh-versions |
| DSHVM_BIN_DIR | 连接器目录覆盖。 | npm 全局 bin 目录 |
| GITHUB_TOKEN / GH_TOKEN | GitHub API 令牌。 | — |
| DSHVM_REGISTRY | npm registry 覆盖(dshvm upgrade 用)。 | https://registry.npmjs.org |
| DSHVM_NPM_REGISTRY_URL | 插件中心查 npm 元数据(作者/下载量)的 registry。 | https://registry.npmjs.org |
DSH_HOME是 dsh 的数据主目录,由隔离数据模式使用,不是 dshvm 的设置项。
升级 dshvm 自身
dshvm 自己也是 npm 包,升级它不用重装:
dshvm upgrade --check # 只看看有没有新版本
dshvm upgrade # 升到 npm 上的 latest- 读 npm registry 上
@dsh-so/dshvm的latest;已是最新就直接退出,什么都不做。 - 实际动作就是
npm install -g @dsh-so/dshvm@latest,所以 npm 得在 PATH 上。 - 若当前运行的不是全局 npm 安装(例如在 checkout 里跑
node bin/dshvm.js),默认拒绝执行,以免悄悄多装一份全局副本;确实要装加--force。 - 私有镜像:设
DSHVM_REGISTRY(或 npm 自己的npm_config_registry);--check --json输出一行 JSON(current/latest/updateAvailable/installMethod/registry),供脚本消费。
卸载
按需选一档:每档都会移除 dshvm,区别是保留多少受管状态(连接器、版本、数据)。
| 档 | 命令 | dsh 结果 |
| --- | --- | --- |
| 0 | npm uninstall -g dshvm | 照常可用(连接器 + ~/.dsh-versions 保留) |
| 1 | + 移除/还原 dshvm 连接器 | 回退到你自己的 npm 全局 dsh |
| 2 | + rm -rf ~/.dsh-versions | 只剩你自己的 npm 全局 dsh |
源码 checkout 位于
~/.dsh-versions之外,所以第 2 档也不会删它们 —— 只删 dshvm 指向它们的指针。
常见问题
Q:use 会影响运行中的会话吗?
A:不会 —— 已运行的进程保持原版本;新启动的 dsh 用激活版本。
Q:dsh web 报端口被占用?
A:dshvm 自动适配:占用则用下一个空闲端口(--port);也可 dsh web --port <n> 自定。
Q:要装的版本不在 npm 上(如 0.1.3-alpha.1)?
A:直接 dshvm install 0.1.3-alpha.1 —— 自动回退到 DSH GitHub 源码构建。
Q:界面里刚装的插件没出现?
A:dsh web 只在启动时读一次 profiles —— 到「运行中」面板点该实例的 ↻ 重启(外部启动的实例在它自己的终端里重启)。
Q:图形界面点「启动」像没反应? A:多半是"共用数据目录"守卫拦下了(弹框 + 底栏 + 「启动状态」区都有记录),选"仍然启动"或"隔离并启动"。更多排障见 ui/README.md。
Q:含符号链接的仓库在 Windows 解压失败? A:跳过并警告,DSH 本体可构建;仅当没有可用的根目录时才失败。
Q:只支持 Windows? A:不是 —— 连接器与路径跨平台;CLI 的 CI 覆盖 Linux / macOS,启动器安装包由 CI 出三平台。
开发与参与贡献
npm test # 离线套件(不联网、不碰你的 ~/.dsh-versions)
npm run test:install # 真实 dsh 安装 + 运行检查(需联网)
cd ui && npm run tauri dev # 启动器开发窗口(热更新)npm test逐个跑test/*.test.js(各自独立进程内node:test)并做lib/加载检查;用临时 home,在受限沙箱也能跑。npm run test:install在临时环境装遍每个真实来源(npm dsh、一个通用 npm 包、GitHub 发布 tgz);设DSHVM_TEST_SOURCE=1还会构建一个不在 npm 上的源码版。- CI 在 Ubuntu / macOS / Windows 上对 Node 18/20/22 跑离线套件;真实安装集成为手动
workflow_dispatch任务。启动器另有ui-ci.yml三系统矩阵与ui-v*tag 的三平台打包发布。
欢迎提 Issue 和 PR。改动提交前先跑一遍离线套件 npm test;涉及桌面的改动见 ui/README.md。
许可
MIT —— © dshvm 贡献者。DSH 版权归 DeepSeek 所有;dshvm 是独立的社区工具。
