Goose 在 Linux 上从源码构建 Desktop 应用:Rust CLI 编译、Electron Forge 打包与系统集成完整指南
本文基于仓库根目录的 BUILDING_LINUX.md,系统讲解如何在 Debian/Ubuntu、Arch、Fedora、openSUSE 乃至 Android/Termux 等环境下从源码构建 goose Desktop 应用:包括各发行版的系统依赖安装、goose Rust 后端二进制的编译、Electron Forge 的 ZIP/DEB/Flatpak 三种打包方式、常见报错排查,以及桌面入口与系统级安装。读完后,你可以独立完成一次完整的 Linux 桌面构建,并理解构建链中每个环节对应的仓库实现。
构建体系总览:一个 Rust 后端 + 一个 Electron 前端
从仓库结构看,goose Desktop 应用由两部分组成:
- Rust 后端:位于
crates/下的 Cargo workspace,最终产出物是goose-clicrate 中的goose可执行文件(见 crates/goose-cli/Cargo.toml 中的[[bin]] name = "goose")。 - Electron 前端:位于 ui/desktop 的 Electron + React 应用,通过 Electron Forge 打包,并在打包时把
goose二进制一并打入安装包。
ui/desktop/forge.config.ts 中声明了 extraResource: ['src/bin', 'src/images', 'src/app-update.yml'],这正是“把 Rust 二进制拷贝到 src/bin”这一步的原因——src/bin 目录会作为额外资源随应用一起分发,应用运行时从该位置加载 goose 后端。因此构建流程必然是:先编译 Rust 二进制 → 拷贝进前端工程 → 再由 Forge 打包。
前置条件
各发行版系统依赖
构建过程依赖 dpkg、fakeroot(DEB/RPM 打包器需要)、Vulkan 头文件与 glslc(着色器编译器,服务于本地推理的 Vulkan 后端)。BUILDING_LINUX.md 给出了各发行版的完整安装命令:
Debian/Ubuntu:
sudo apt update
sudo apt install -y dpkg fakeroot build-essential clang libxcb1-dev libxcb-util-dev protobuf-compiler libvulkan-dev libvulkan1 glslc
Arch/Manjaro:
sudo pacman -S --needed dpkg fakeroot base-devel vulkan-headers vulkan-icd-loader shaderc
Fedora/RHEL/CentOS:
sudo dnf install dpkg-dev fakeroot gcc gcc-c++ make libxcb-devel vulkan-headers vulkan-loader glslc
openSUSE:
sudo zypper install dpkg fakeroot gcc gcc-c++ make vulkan-headers vulkan-loader glslc
Android / Termux:
如果只是想安装现成的 goose CLI,仓库根目录的安装脚本 download_cli.sh 会检测 Termux 环境(TERMUX_VERSION 变量)并自动选择 musl 便携构建,即等效设置 GOOSE_LINUX_VARIANT=musl。该脚本对 Linux 支持 standard、vulkan、musl 三种变体(download_cli.sh 中的 case 分支分别对应 -gnu、-gnu-vulkan、-musl 三种产物文件名)。
若要在 Termux 中从源码构建:
pkg install rust cmake protobuf clang build-essential
cargo build --release -p goose-cli --bin goose --no-default-features --features portable-default
注意:musl/便携构建会禁用
local-inference(依赖 V8)和system-keyring(依赖 D-Bus SecretService),因为 Android 上两者都不可用。这一点可以从 crates/goose-cli/Cargo.toml 的 feature 定义印证:默认 feature 列表包含local-inference、system-keyring,而portable-default仅保留rustls-tls、aws-providers、telemetry、otel四项,恰好移除了上述两项。
开发工具
- Rust:通过 rustup 安装
- Node.js:文档要求 22.9.0 或更高版本(可用 nvm 管理版本)。需要留意的是,当前仓库 ui/desktop/package.json 的
engines字段声明为"node": "^24.10.0"、"pnpm": ">=10.30.0",实际构建时建议以仓库声明的引擎版本为准 - pnpm:10 或更高版本(可通过 Hermit 管理或全局安装)
- just:命令执行器,Rust 装好后执行
cargo install just安装
构建流程
第 1 步:克隆代码
git clone https://gitcode.com/GitHub_Trending/goose3/goose
cd goose
第 2 步:编译 goose CLI
cargo build --release -p goose-cli --bin goose
编译产物位于 target/release/goose。如果编译报错想确认 workspace 中可选的包名,可以执行:
cargo test -p
该命令会列出当前 workspace 中所有可用的包。
从 crates/goose-cli/Cargo.toml 可以看到,除默认 feature 外还支持几个与 Linux 图形栈相关的选项:vulkan = ["goose/vulkan", "local-inference"]、cuda、mlx 等。若需要 Vulkan 变体(例如配合下文 DEB/RPM 的 Vulkan 依赖声明),构建时追加 --features vulkan 即可;仓库 Justfile 中的 linux_vulkan_features 变量也正是按此模式在 Linux 上自动拼接 --features vulkan 的。
第 3 步:准备 Desktop 应用
cd ui/desktop
pnpm install
# 把 goose 二进制拷贝到预期位置
mkdir -p src/bin
cp ../../target/release/goose src/bin/
这一步在仓库的 Justfile 中已经封装为快捷任务:just release-binary 会执行 cargo build --release -p goose-cli --bin goose 并通过 copy-binary 把产物 cp -p 到 ./ui/desktop/src/bin/,因此日常开发中也可以直接用 just release-binary 替代“编译 + 拷贝”两步。
第 4 步:打包应用
ui/desktop/package.json 中 make 脚本的完整定义是 pnpm run build-goose-sdk && pnpm run i18n:compile && electron-forge make,即打包前会自动构建 @aaif/goose-sdk 并编译国际化消息,无需手动执行这两步。
方式 A:ZIP 分发包(推荐)
适用于所有 Linux 发行版:
pnpm run make --targets=@electron-forge/maker-zip
输出:out/make/zip/linux/x64/goose-linux-x64-{version}.zip
方式 B:DEB 包
面向 Debian/Ubuntu 系统:
pnpm run make --targets=@electron-forge/maker-deb
输出:out/make/deb/x64/goose_{version}_amd64.deb
DEB 打包器在 ui/desktop/forge.config.ts 中的配置值得注意:当环境变量 GOOSE_DESKTOP_LINUX_VARIANT 设为 vulkan 时,会自动给包追加 libvulkan1 运行时依赖(depends: ['libvulkan1']);desktopTemplate 指向 ui/desktop/forge.deb.desktop,其中已声明 MimeType=x-scheme-handler/goose,与 Forge 配置中的 protocols: [{ name: 'GooseProtocol', schemes: ['goose'] }] 相呼应——即安装后 goose 自定义 URL scheme 会由桌面条目接管。
方式 C:同时构建全部格式
pnpm run make
附:Flatpak 包
Flatpak 构建在 CI 中受支持,本地构建方式见后文“发行版相关说明”。
第 5 步:运行应用
从构建目录直接运行:
./out/goose-linux-x64/goose
安装 DEB 包(若已构建):
sudo dpkg -i out/make/deb/x64/goose_*.deb
关于输出目录,ui/desktop/README.md 给出了按架构划分的完整对照表:ZIP 位于 out/make/zip/linux/x64|arm64/,DEB 位于 out/make/deb/x64/*_amd64.deb 或 arm64/*_arm64.deb,RPM 位于 out/make/rpm/x64/*.x86_64.rpm,Flatpak 位于 out/make/flatpak/x86_64/*.flatpak。需要注意两点:--arch 参数只控制 Electron 的架构,不会重新编译 Rust 二进制;要产出 ARM64 包,必须在 ARM64 Linux 主机上执行 cargo build,不能把 x64 主机产出的 goose 二进制打进 ARM64 的 Electron 包。
故障排查
缺少系统依赖
若出现与 dpkg、fakeroot、Vulkan 头文件或 glslc 相关的报错,回到“前置条件”一节按你的发行版安装对应依赖包。
GLib 警告
运行期间可能看到如下警告:
GLib-GObject: instance has no handler with id
这些是无害的,不影响功能。如需屏蔽,可创建启动脚本:
#!/bin/bash
cd /path/to/goose/ui/desktop/out/goose-linux-x64
./goose 2>&1 | grep -v "GLib-GObject" | grep -v "browser_main_loop"
提示 “Goose binary not found”
依次确认以下三步都已完成:
- 已编译 Rust 二进制:
cargo build --release -p goose-cli --bin goose - 已拷贝到正确位置:
cp ../../target/release/goose src/bin/ - 已重新打包:
pnpm run make
该报错的根源就是 Forge 的 extraResource 只包含 src/bin 目录中实际存在的文件(ui/desktop/forge.config.ts),二进制没拷贝进去,打包后应用自然找不到后端。
发行版相关说明
Arch/Manjaro
- RPM 打包器在 Arch 系系统上默认不可用(不兼容),请使用 ZIP 分发方式以获得最大兼容性。
Flatpak
本地构建步骤:
# 安装 flatpak 和 flatpak-builder
sudo apt install flatpak flatpak-builder
# 添加 Flathub 远程
flatpak remote-add --if-not-exists --user flathub <Flathub 官方仓库地址>
# 使用 Electron Forge 构建
pnpm run make --targets=@electron-forge/maker-flatpak
输出:out/make/flatpak/x86_64/*.flatpak
Flatpak 的完整配置在 ui/desktop/forge.config.ts 中,可以看到几个关键设计:使用 25.08 版 GNOME runtime;通过 libbz2-shim 模块在应用内建立 libbz2.so.1.0 软链接以兼容多架构路径;单独打包 git 与 git-remote-https(因为 goose 后端依赖 git);finishArgs 中开放了 --socket=x11、--socket=wayland、--device=dri(GPU 渲染)等权限。
Snap
目前不支持 Snap 构建,未来可能会添加。
日常开发工作流
针对日常迭代,BUILDING_LINUX.md 建议区分三种场景:
- 后端改动:重新执行
cargo build --release -p goose-cli --bin goose并拷贝二进制; - 前端改动:使用
pnpm run start热重载开发。查看 ui/desktop/package.json 可知,start脚本实际是cd ../.. && just run-ui,而 Justfile 中的run-ui任务 =just release-binary(编译并拷贝二进制)+cd ui/desktop && pnpm install && pnpm run start-gui,即每次都会保证前端连的是最新后端;若只想启动前端不重新编译,可用just run-ui-only; - 完整重建:按上文“构建流程”从头执行。
此外,仓库还提供一个进阶模式:让桌面端连接外部 ACP 后端,从项目根目录运行 GOOSE_SERVER__SECRET_KEY=test cargo run -p goose-cli --bin goose -- serve --platform desktop --enable-scheduler --host 127.0.0.1 --port 3000,再以 GOOSE_EXTERNAL_BACKEND=true 环境变量启动前端(详见 ui/desktop/README.md),对应 Justfile 的 debug-ui 任务。
系统集成
桌面入口
创建 ~/.local/share/applications/goose.desktop:
[Desktop Entry]
Name=goose AI Agent
Comment=Local AI agent for development tasks
Exec=/path/to/goose/ui/desktop/out/goose-linux-x64/goose %U
Icon=/path/to/goose/ui/desktop/out/goose-linux-x64/resources/app.asar.unpacked/src/images/icon.png
Terminal=false
Type=Application
Categories=Development;Utility;
StartupNotify=true
MimeType=x-scheme-handler/goose
注意 MimeType=x-scheme-handler/goose 一行使系统能在浏览器点击 goose:// 链接时唤起应用;这与 Forge 打包时注册的 GooseProtocol(ui/desktop/forge.config.ts)以及 DEB 模板 forge.deb.desktop 中的声明保持一致,说明 URL scheme 是构建与打包两条链路共同约定的能力。
系统级安装
sudo cp -r out/goose-linux-x64 /opt/goose
sudo ln -s /opt/goose/goose /usr/local/bin/goose-gui
使用 goose-gui 作为命令名,是为了与 CLI 的 goose 命令区分开。
贡献建议
如果你修改了影响 Linux 构建流程的代码,按 BUILDING_LINUX.md 的要求:尽量在多个发行版上测试、同步更新该文档、在必要时更新 ui/desktop/README.md,并评估对 CI/CD 自动构建的影响。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00