把 Rust 项目发布到 Debian,常见难点其实不在编译本身,而在于怎么把可执行文件、依赖信息和服务配置整理成 Debian 能识别的安装包。下面按“环境准备、构建打包、安装验证、进阶发布”四个层次展开,既保留最短可跑通路径,也补上需要进入仓库分发时必须了解的边界。
准备环境:先把 Rust 和 Debian 打包工具装齐
如果机器上还没有 Rust 工具链,可以先用 rustup 安装;已经安装过的话,也建议顺手更新到最新版本。需要注意的是,文中使用的 cargo-deb 需要 Rust 1.63 及以上版本。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
# 添加Rust到PATH
rustup update
接着安装用于生成 Debian 包的工具和系统依赖:
cargo install cargo-deb
# 需Rust 1.63及以上版本
sudo apt install dpkg dpkg-dev liblzma-dev
# Debian打包基础工具
这一组依赖里,cargo-deb 负责从 Rust 项目直接生成 .deb,dpkg 和 dpkg-dev 提供 Debian 打包基础能力,后面安装和测试环节也会用到。
正式打包前,先完成 Release 构建和测试
进入项目根目录后,先做一次 Release 构建,确保最终用于分发的是优化后的可执行文件。生成结果默认位于 target/release/。
cargo build --release
只要是准备交付给别人安装的程序,建议在这一步同时跑一遍测试。原文虽然没有给出完整命令块,但这里的判断标准很明确:至少要确认项目能正常编译,并且核心功能经过 cargo test 验证。
如果构建阶段还有编译错误、路径问题或依赖未解决,后面的 Debian 打包通常也不会更顺利,所以这一步最好不要省。
用 cargo-deb 生成 Debian 安装包
对于大多数只想把 Rust 程序发布为 Debian 安装包的项目来说,cargo-deb 是最直接的方案。它会从 Cargo.toml 自动提取项目名称、版本、作者等元数据,减少手工维护 Debian 打包文件的工作量。

在项目根目录执行:
cargo deb
生成的 .deb 文件默认位于 target/debian/,命名格式为 <项目名>_<版本号>-1_<架构>.deb,例如 my_app_1.0.0-1_amd64.deb。
几个常用参数怎么用
--output <路径>:指定输出目录,例如cargo deb --output ./packages。--install:生成后直接安装,效果等同于dpkg -i。--separate-debug-symbols:把调试符号拆分到/usr/lib/debug/,方便后续排错和调试。
如果你的目标只是内部交付、测试环境部署或团队内分发,到这里通常已经可以拿到可安装的 Debian 包。
安装 .deb 后要验证什么
拿到安装包后,可以直接用 dpkg 安装:
sudo dpkg -i target/debian/your_project_name_*.deb
如果安装时提示依赖缺失,再运行下面这条命令自动修复:
sudo apt-get install -f
安装完成后,至少做两类验证:
- 命令行程序是否能直接通过项目名启动,例如
your_project_name; - 如果项目被配置成系统服务,是否能通过
systemctl正常管理和启动。
这一步的重点不是“装上就算完成”,而是确认安装后的路径、依赖和运行方式与预期一致,避免出现包能装、程序却跑不起来的情况。
需要自定义包信息时,修改 Cargo.toml
默认情况下,cargo-deb 会读取现有的 Cargo 元数据。但如果你希望更精确地控制 Debian 包中的描述、依赖关系或分类,可以在 Cargo.toml 中增加 [package.metadata.deb] 配置。
[package.metadata.deb]
maintainer = "Your Name <your.email@example.com>"
depends = "libc6 (>= 2.31), openssl (>= 3.0)"
description = "A Rust application for Debian systems."
section = "utils"
priority = "optional"
这里最值得关注的是 depends 字段。它决定安装时 Debian 如何判断运行依赖是否满足,写得过松可能导致运行时报错,写得过严又可能限制可安装环境,实际填写时最好依据目标系统版本和真实链接库来确认。
项目作为服务运行时,如何打进 systemd 配置
如果你的 Rust 项目不是一次性命令行工具,而是常驻后台运行的服务,可以把 systemd 单元文件一起打进 Debian 包。做法是在 Cargo.toml 里添加 [package.metadata.deb.systemd-units] 配置,指向服务文件路径。
[package.metadata.deb.systemd-units]
my_app = "src/systemd/my_app.service"
示例 my_app.service 文件内容如下:
[Unit]
Description=My Rust Application
After=network.target
[Service]
User=my_user
Group=my_group
ExecStart=/usr/bin/my_app
Restart=always
[Install]
WantedBy=multi-user.target
cargo-deb 会把这个服务文件一起打包进 .deb。这样安装后,程序就不只是“能运行”,而是可以按 Debian 服务的方式纳入系统管理。
不过这里要特别确认两件事:一是 ExecStart=/usr/bin/my_app 是否与实际安装路径一致,二是 User、Group 是否在目标机器上存在,否则服务安装后可能无法正常启动。
要发布到 Debian 仓库,还需要补齐标准打包目录
如果你的目标不是单独分发一个 .deb 文件,而是上传到公共 Debian 仓库(例如 Debian Sid)或私有仓库,那么仅靠 cargo-deb 还不够。这时需要按照 Debian 规范维护完整的打包目录。

- 创建
debian/目录,并添加必要文件,例如control、changelog、copyright、rules等。 - 使用
debuild构建符合 Debian 标准的源码包和二进制包:
debuild -us -uc
# -us跳过签名,-uc跳过校验
- 将生成的
.changes文件上传到目标仓库,前提是你具备对应仓库的上传权限。
可以把这一步理解为两种发布路径的分界线:如果只是给用户或服务器安装,用 cargo deb 往往已经够用;如果要进入 Debian 仓库体系,就必须遵循更完整的 Debian 打包规范。
一条更实用的发布路径总结
对多数 Rust 项目来说,Debian 发布的最短路径是:安装 Rust 和打包依赖,执行 cargo build --release,再用 cargo deb 生成并测试 .deb。只有当你需要更精细的元数据控制、systemd 集成或仓库分发时,才继续补充 Cargo.toml 配置和标准 debian/ 目录。
按照这个顺序推进,既能尽快拿到可安装成果,也能在项目规模扩大时平滑过渡到更标准的 Debian 发布流程。









