首页
/ Goose 在 Linux 上从源码构建 Desktop 应用:Rust CLI 编译、Electron Forge 打包与系统集成完整指南

Goose 在 Linux 上从源码构建 Desktop 应用:Rust CLI 编译、Electron Forge 打包与系统集成完整指南

2026-09-05 13:14:31作者:韦蓉瑛

本文基于仓库根目录的 BUILDING_LINUX.md,系统讲解如何在 Debian/Ubuntu、Arch、Fedora、openSUSE 乃至 Android/Termux 等环境下从源码构建 goose Desktop 应用:包括各发行版的系统依赖安装、goose Rust 后端二进制的编译、Electron Forge 的 ZIP/DEB/Flatpak 三种打包方式、常见报错排查,以及桌面入口与系统级安装。读完后,你可以独立完成一次完整的 Linux 桌面构建,并理解构建链中每个环节对应的仓库实现。

构建体系总览:一个 Rust 后端 + 一个 Electron 前端

从仓库结构看,goose Desktop 应用由两部分组成:

  1. Rust 后端:位于 crates/ 下的 Cargo workspace,最终产出物是 goose-cli crate 中的 goose 可执行文件(见 crates/goose-cli/Cargo.toml 中的 [[bin]] name = "goose")。
  2. 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 打包

前置条件

各发行版系统依赖

构建过程依赖 dpkgfakeroot(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 支持 standardvulkanmusl 三种变体(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-inferencesystem-keyring,而 portable-default 仅保留 rustls-tlsaws-providerstelemetryotel 四项,恰好移除了上述两项。

开发工具

  • Rust:通过 rustup 安装
  • Node.js:文档要求 22.9.0 或更高版本(可用 nvm 管理版本)。需要留意的是,当前仓库 ui/desktop/package.jsonengines 字段声明为 "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"]cudamlx 等。若需要 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.jsonmake 脚本的完整定义是 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.debarm64/*_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 包。

故障排查

缺少系统依赖

若出现与 dpkgfakeroot、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”

依次确认以下三步都已完成:

  1. 已编译 Rust 二进制:cargo build --release -p goose-cli --bin goose
  2. 已拷贝到正确位置:cp ../../target/release/goose src/bin/
  3. 已重新打包: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 软链接以兼容多架构路径;单独打包 gitgit-remote-https(因为 goose 后端依赖 git);finishArgs 中开放了 --socket=x11--socket=wayland--device=dri(GPU 渲染)等权限。

Snap

目前不支持 Snap 构建,未来可能会添加。

日常开发工作流

针对日常迭代,BUILDING_LINUX.md 建议区分三种场景:

  1. 后端改动:重新执行 cargo build --release -p goose-cli --bin goose 并拷贝二进制;
  2. 前端改动:使用 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
  3. 完整重建:按上文“构建流程”从头执行。

此外,仓库还提供一个进阶模式:让桌面端连接外部 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),对应 Justfiledebug-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 打包时注册的 GooseProtocolui/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 自动构建的影响。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
588
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
906
1.83 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
891
5.79 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.53 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.34 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
988
506
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384