0、用户需求
-
楼主背景:非计算机行业,对AI的主要需求是搞调研、写报告、制作小工具辅助科研等等,完全没有自主阅读或编写代码的能力,只能按照指示输入命令并执行。
-
需求:接入一个类似WorkBuddy类的Agent,解放双手。经过比对发现DSH可能是门槛最低的,因此选择尝试安装DSH。但龙芯应用合作社的包并不兼容,所以问deepseek直接安装。
-
硬件:3A6000/LG110,华硕XC-LS3A6M主板
-
说明:整个安装过程由deepseek网页版指导,楼主只复制粘贴命令并把反馈提交。楼主并看不懂发生了什么,所以整个记录也是由deepseek总结的,因此可能出一些问题。如果有专业人士发现问题烦请指正。
1. 本文范围与环境
本文记录在 AOSC OS + LoongArch(loong64) 上从源码编译 DeepSeek Harness(DSH),直到 Web UI 成功启动并完成核心功能验收 为止。
环境:
-
系统:AOSC OS,LoongArch
-
包管理器:
oma -
仓库: GitHub - hawordh/deepseek-harness-loongarch: DeepSeek Harness: Everything is a Plugin. · GitHub (社区维护的 LoongArch 适配分支)
-
终点:终端打印
dsh web: ``http://127.0.0.1:3080,浏览器可正常对话、读写文件、执行 Shell、刷新后会话恢复。
2. 安装编译依赖
目标: 安装编译 DSH 及其原生依赖所需的系统库和工具链。
实际执行: 先按 Debian 习惯执行:
bash
sudo oma install libvips-devel glib2-devel libjpeg-turbo-devel ...
遇到的问题: oma 全部报“无法找到匹配关键字”。AOSC 的开发包后缀是 -dev,编译工具元包叫 devel-base,不是 Debian 的 -devel 和 base-devel。另外 glib2-dev 在 AOSC 源里也不存在。
解决方式: 改用 AOSC 的包名,并去掉单独安装 glib2-dev 的步骤(libvips-dev 会自动带入 GLib 开发文件):
bash
sudo oma install libvips-dev devel-base pkg-config \
libjpeg-turbo-dev libpng-dev libtiff-dev libwebp-dev
可以用 pkg-config --cflags glib-2.0 验证 GLib 头文件是否就位。
3. 获取源码并安装依赖(pnpm install)
目标: 克隆仓库,启用 corepack,用 pnpm 安装全部依赖。
实际执行:
bash
git clone --depth=1 https://github.com/hawordh/deepseek-harness-loongarch.git
cd deepseek-harness-loongarch
corepack enable
pnpm install
3.1 问题:龙芯镜像源的包与 lockfile 哈希不一致
遇到的问题: 首次 pnpm install 使用默认的 registry.loongnix.cn,大量包报 ERR_PNPM_TARBALL_INTEGRITY,包括 lightningcss、sharp、rolldown、oxlint、oxc-parser 等。这些包的共同点是含架构相关的原生二进制或解析器,龙芯镜像很可能对它们做过本地重打包,导致内容哈希与 lockfile 记录的上游官方哈希不一致。
解决方式: 绕过龙芯镜像,使用 npm 官方源重新安装:
bash
pnpm install --registry=https://registry.npmjs.org
切换后哈希校验全部通过,920 个包正常安装。
3.2 问题:lefthook 在 loong64 上没有预编译包
遇到的问题: 安装末尾,根目录 postinstall 脚本 install-lefthook.mjs 报:
text
Cannot find module 'lefthook-linux-loong64/bin/lefthook'
lefthook 是 Git 钩子管理器,和 DSH 编译运行无关。它没有 loong64 的 npm 二进制包,安装脚本找不到就失败。
解决方式: 关闭 pnpm 的依赖预检查,避免 pnpm run build 时再次触发内部 install 和 postinstall:
bash
pnpm config set verify-deps-before-run false
4. 构建(pnpm run build)
目标: 编译 host 和 client 产物。
实际执行:
bash
pnpm run build
构建过程中遇到两个缺少 LoongArch 原生绑定的包,分别处理。
4.1 问题:rolldown 缺少 LoongArch 原生绑定
遇到的问题: 构建在 tsdown 调用 rolldown 时报:
text
Cannot find module '@rolldown/binding-linux-loong64-gnu'
Cannot find module './rolldown-binding.linux-loong64-gnu.node'
Rolldown 官方没有发布 LoongArch 绑定,WASM 回退在龙芯上又因 Node.js 不支持所需 SIMD 指令而不可用。
解决方式: 从源码编译 Rust 原生绑定:
bash
sudo oma install rustc cargo cmake
git clone --depth=1 -b v1.1.1 https://github.com/rolldown/rolldown.git
cd rolldown
cargo build --release -p rolldown_binding
产物为 target/release/librolldown_binding.so。复制并重命名到 pnpm 虚拟存储区中 rolldown 期望的路径:
bash
cp target/release/librolldown_binding.so \
/home/neon/deepseek-harness-loongarch/node_modules/.pnpm/rolldown@1.1.1/node_modules/rolldown/dist/shared/rolldown-binding.linux-loong64-gnu.node
验证加载:
bash
node -e "require('/home/neon/deepseek-harness-loongarch/node_modules/.pnpm/rolldown@1.1.1/node_modules/rolldown'); console.log('rolldown native binding loaded OK')"
4.2 问题:lightningcss 缺少 LoongArch 原生绑定
遇到的问题: rolldown 解决后,构建推进到 lightningcss,报:
text
Cannot find module '../lightningcss.linux-loong64-gnu.node'
同样,官方没有 LoongArch 预编译绑定。
解决方式: 从源码编译。这里有一个关键坑:直接 cargo build --release 得到的是过程宏 .so(如 liblightningcss_derive-*.so),不是 Node.js 能加载的 N-API 模块。必须构建专门的 Node 绑定 crate。
先确认包名:
bash
git clone --depth=1 -b v1.32.0 https://github.com/parcel-bundler/lightningcss.git
cd lightningcss
cargo metadata --no-deps --format-version 1 | grep -o '"name":"[^"]*"' | sort -u
确认存在 lightningcss_node 后构建:
bash
cargo build --release -p lightningcss_node
产物为 target/release/liblightningcss_node.so。用 nm -D 确认它导出了 N-API 符号:
bash
nm -D target/release/liblightningcss_node.so | grep napi_register_module_v1
有输出才说明是真正的 N-API 模块。然后复制并重命名:
bash
cp target/release/liblightningcss_node.so \
/home/neon/deepseek-harness-loongarch/node_modules/.pnpm/lightningcss@1.32.0/node_modules/lightningcss/lightningcss.linux-loong64-gnu.node
验证:
bash
cd /home/neon/deepseek-harness-loongarch
node -e "require('lightningcss'); console.log('lightningcss binding OK')"
两个绑定就位后,pnpm run build 成功完成。
5. 启动 DSH
目标: 用源码方式启动 DSH Web UI。
实际执行: 先尝试:
bash
pnpm dsh web --no-open
启动过程中遇到两个问题,分别处理。
5.1 问题:--expose-internals 必须直接写在命令行
遇到的问题: HMR 服务报:
text
--expose-internals is required for HMR service
这个标志不能放在 NODE_OPTIONS 环境变量里,必须作为 Node 的真实命令行参数传递。
解决方式: 改用 node 直接调用入口文件:
bash
node --expose-internals --import tsx/esm apps/cli/src/bin.ts web --no-open
5.2 问题:directory-picker-native 包路径缺失
遇到的问题: 启动时插件树加载失败:
text
Cannot find package '@deepseek-ai/dsh-client-ui-directory-picker-native'
这是当前源码版本的 tsconfig.base.json 里 paths 映射缺失导致的。
解决方式: 在 tsconfig.base.json 的 compilerOptions.paths 中补上:
json
"@deepseek-ai/dsh-client-ui-directory-picker-native": ["./packages/client/ui-directory-picker-native/src"],
"@deepseek-ai/dsh-client-ui-directory-picker-native/*": ["./packages/client/ui-directory-picker-native/src/*"],
"@deepseek-ai/dsh-client-ui-directory-picker-browse": ["./packages/client/ui-directory-picker-browse/src"],
"@deepseek-ai/dsh-client-ui-directory-picker-browse/*": ["./packages/client/ui-directory-picker-browse/src/*"]
tsx 运行时实时读取该配置,不需要重新构建。
最终启动命令:
bash
cd /home/neon/deepseek-harness-loongarch
node --expose-internals --import tsx/esm apps/cli/src/bin.ts web --no-open
看到 dsh web: http://127.0.0.1:3080 后,浏览器访问该地址即可。
6. 启动前验证原生模块
目标: 确认 sharp 和 node-pty 这两个核心原生模块能加载。它们是图像处理和 Shell 执行的基础。
实际执行:
bash
node -e "require('sharp'); console.log('sharp OK')"
node -e "require('node-pty'); console.log('node-pty OK')"
结果: 本次两条均输出 OK,说明 pnpm install 的 postinstall 已用本机工具链编译成功,无需额外手动处理。如果报错,需进入对应 .pnpm 目录执行 npm run build(sharp)或 npx node-gyp rebuild(node-pty)。
7. 核心功能验收
目标: 启动后逐项实测,全部通过才算真正可用。
实际执行与结果:
-
模型对话:在设置中填入 API Key 并保存,不重启直接发消息,能收到回复。
-
文件读写:指定测试目录,让 Agent 创建文件并读回内容,成功。
-
Shell 执行:让 Agent 执行
echo hello-loongarch并返回输出,成功。 -
会话恢复:多轮对话后刷新浏览器,历史记录仍在。
四项全部通过。
8. 经验与注意事项
-
龙芯镜像源不可盲信:
registry.loongnix.cn上的原生包可能与 lockfile 哈希不一致,优先用 npm 官方源安装。 -
含原生二进制的 npm 包是主要障碍:
rolldown、lightningcss、sharp、node-pty在 loong64 上都需要特别处理。前两个需要从源码编译 N-API 绑定;后两个在本次安装中由 postinstall 自动完成,但仍需显式验证。 -
编译
lightningcss时要认准 crate:lightningcss_node才是 Node 绑定,lightningcss_derive只是过程宏。用nm -D | grep napi_register_module_v1确认产物身份。 -
手动放入
.pnpm的绑定可能被清掉:建议把编译好的.node文件备份到项目外,重新pnpm install后如遇缺失可直接恢复,不必重编。 -
--expose-internals必须走命令行:放进NODE_OPTIONS会导致 HMR 失败。 -
DSH 仍是开发者预览版:官方承认会有破坏性变更,部分功能在 x86 上也不完整。核心功能通过说明安装流程走通,但不代表所有扩展功能都稳定可用。
9. 最短复现路径
bash
# 1. 依赖
sudo oma install libvips-dev devel-base pkg-config libjpeg-turbo-dev libpng-dev libtiff-dev libwebp-dev rustc cargo cmake
# 2. 克隆
git clone --depth=1 https://github.com/hawordh/deepseek-harness-loongarch.git
cd deepseek-harness-loongarch
# 3. 安装(官方源 + 关闭依赖预检查)
corepack enable
pnpm config set verify-deps-before-run false
pnpm install --registry=https://registry.npmjs.org
# 4. 编译 rolldown 绑定(见 4.1)
# 5. 编译 lightningcss 绑定(见 4.2)
# 6. 补 tsconfig.base.json 的 paths 映射(见 5.2)
# 7. 构建
pnpm run build
# 8. 验证原生模块
node -e "require('sharp'); console.log('sharp OK')"
node -e "require('node-pty'); console.log('node-pty OK')"
# 9. 启动
node --expose-internals --import tsx/esm apps/cli/src/bin.ts web --no-open
10. 后续工作
现在电脑里面有了一个可用的DSH,剩下的就直接交由DSH自己完成。主要工作有:
- 让DSH升级到最新版。注意DSH意识不到他升级的时候会重启服务,会提前把自己关掉,从而卡住。需要在提示词里首先和他约定好步骤,在他指定的时机重新启动服务。
- 将浏览器访问
http://127.0.0.1:3080替换成一个独立的桌面APP。毕竟浏览器访问还是显得不方便,因此让他自己搞定electron套壳,这样就有了一个看起来独立的DSH。 - 安装插件市场和必要的插件、安装skill等:完全靠提示词让他自己完成。
这样就有了一个功能比较完全而且界面比较美观的DSH,和windows版的体验几乎相当,甚至可以有大肥鱼桌宠,目前使用了一周暂未发现什么明显的问题。