环境准备

  • 需要 Mac 本机安装 python3(3.11及以上) 或者 brew
  • 需要 Mac 本机安装 Rust(1.77及以上)

安装 zig 语言包及工具

# 安装 zig 语言包及工具,python方式
pip3 install ziglang

或者 brew 方式

brew install zig

安装 Rust 编译插件

# 安装 cargo-zigbuild
cargo install cargo-zigbuild

# 使用rustup添加
rustup target add x86_64-unknown-linux-musl

并在 ~/.cargo/config.toml 中增加配置

[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"

构建命令

在Rust项目根目录执行如下编译命令,注意与非跨平台编译的区别:

cargo zigbuild --release --target x86_64-unknown-linux-musl

制作最小Docker镜像

Dockerfile 文件:

FROM scratch
WORKDIR /opt/app
COPY ./target/x86_64-unknown-linux-musl/release/web-hook-rs .
COPY ./Rocket.toml .
CMD [ "/opt/app/web-hook-rs" ]

构建Docker镜像:

docker build -t web-hook:0.0.1 .

运行测试

docker run -it web-hook:0.0.1

# 容器输出
# Rocket has launched from http://0.0.0.0:8080

容器正常启动了Rocket应用并输出上述文字信息,表明测试成功!

Rust和Go的应用对比

构建好的Rust应用镜像大小是 13.5MB ,其中交叉编译后的 ./target/x86_64-unknown-linux-musl/release/web-hook-rs9.9MB; 相比较而言,使用 go 语言编写的相同功能程序的可执行文件大小是 27MB。 即 Rust 相同功能的程序编译的大小大约是 Go 生成的 50% , 甚至更小到 40% 。可能是 Go 加入运行时的关系。

但 Rust 的语法确实相对更加复杂,所以可能需要平衡研发效率、运行效率及磁盘占用(传输效率)等各个因素。

注意事项

以上示例,本人在x86的MacBookPro环境运行通过,其他环境未进行测试。

参考文章