Rust工程的分发

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2021/12/20/rust-build-deploy/



Rust项目直接用Cargo build就可以产出构建物,但是这个构建物不一定真能在部署端运行起来,常见问题有以下几个。

Glibc版本

一般我们的构建都是放linux平台的,Glibc是GUN发布的c库,真正的底层依赖。Rust在编译的时候绝大部分都是静态链接,但是对于C标准库,它使用的还是动态链接。Glibc广泛存在,本来也不是啥大问题,但是如果构建的时候使用了相对新的版本,而运行环境是在其他使用低版本Glibc的系统,那么就会有 version `GLIBC_2.18' not found 这种问题。

解决方案有很多种,最简单的就是换一个libc的实现,musl是一个相对合理的选择。只要在构建的时候选择x86_64-unknown-linux-musl就行了。

cargo build --target x86_64-unknown-linux-musl

构建环境还需要musl-tools环境。

如果由于一些特殊原因没法用musl,还可以考虑降级Glibc。比如使用低版本的Ubuntu进行构建,也可以使用cross工具。

外部文件

如果追求单文件,那么各种配置文件和其他文件依赖就是一个问题。最直接的方法是使用include_str直接把内容放在构建物中,sqlx::migrate就是用的这种方法。如果是其他文件,也可以自己实现,或者使用第三方的库,比如rust-embed等。

Docker镜像

Docker镜像更多的问题是在大小上,一般来说采用多步构建就行了。构建镜像可以用rust镜像,运行环境用debian:buster-slim。如果有其他依赖,比如openssl、sqlite也可以自行安装。



本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2021/12/20/rust-build-deploy/

发表评论