Rust 安装部署以及版本管理

2022-01-26 rust language

简介

这里简单介绍如何安装。

安装

Rust Install 中提供了相关的安装方式,在 Linux 中提供了一个简单的安装脚本,会适配不同的平台。

如果只能离线安装,那么可以参考 Other Rust Installation Methods 中对应的包,也就是 Standalone installers 段落中的内容,一般是 x86_64-unknown-linux-gnu 包,解压之后查看 README.md 有对应的离线安装方法,一般是:

----- 安装Rust
# bash install.sh
----- 卸载Rust
# /usr/local/lib/rustlib/uninstall.sh

默认会安装到 /usr/local 目录下,例如二进制文件在 /usr/local/bin 目录下,库文件在 /usr/local/lib 目录下等等,所以,需要将相关的路径添加到对应环境变量中,例如 PATH

安装完成后可以通过如下命令查看其版本号信息。

$ rustc --version
rustc 1.45.0 (5c1f21c3b 2020-07-13)
$ cargo --version
cargo 1.45.0 (744bd1fbb 2020-06-15)

注意,编译时是需要 gcc 工具链中的 cc 命令。

Hello World

简单打印相关的信息。

$ cat main.rs
fn main() {
    println!("Hello World!!!");
}
$ rustc main.rs
$ ./main
Hello World!!!

RustUp

除了上述的二进制安装方式之外,官方推荐的是 RustUp 这个工具,不仅可以维护多个版本,还可以按需在不同版本之间切换。

国内源配置

国外的源都比较慢,这里增加如下字节的配置,详细可以参考 rsproxy.cn 的介绍。

$ cat ~/.cargo/config
[source.crates-io]
replace-with = 'rsproxy'
[source.rsproxy]
registry = "https://rsproxy.cn/crates.io-index"
[registries.rsproxy]
index = "https://rsproxy.cn/crates.io-index"
[http]
check-revoke = false # 是否检查SSL证书废除
proxy="http://user_name:user_password@proxy.example.com:8090"
[https]
proxy="http://user_name:user_password@proxy.example.com:8090"
[net]
git-fetch-with-cli = true

----- 使用国内镜像加速 Rustup 工具链
$ cat ~/.bashrc
export RUSTUP_DIST_SERVER="https://rsproxy.cn"
export RUSTUP_UPDATE_SERVER="https://rsproxy.cn/rustup"

注意,如果在 [net] 中配置了 git-fetch-with-cli=true 也就是通过 git 客户端下载,那么就需要注意 http.proxyhttps.proxy 两个参数。

另外,当代理的用户名密码有特殊字符时需要进行配置,详见 HTTP/HTTPS 代理协议 中的介绍。

其它还可以参考 中科大清华 的代理,配置完之后可以通过如下命令安装。

curl --proto '=https' --tlsv1.2 -sSf https://rsproxy.cn/rustup-init.sh | sh

一般是通过 rustup-init.sh 脚本安装,默认安装到 ~/.cargo 目录下,安装完成后通过 source ~/.cargo/env 加载相关的环境变量即可,也就是将 ~/.cargo/bin 添加到 PATH 环境变量中,默认也会添加到 ~/.bashrc 文件中,可以通过 rustc --version 以及 cargo --version 查看版本以及是否安装成功。

常用命令

----- 安装stable的最新版本,一般每六周发布一次
$ rustup update
----- 更新rustup自己、删除
$ rustup self update
$ rustup self uninstall
----- 安装日更版
$ rustup toolchain install nightly
----- 删除指定版本
$ rustup toolchain uninstall 1.22.1

----- 查看当前支持的版本,并切换
$ rustup toolchain list
$ rustup default nightly

其它

默认会安装到 ~/.cargo~/.rustup 目录下,可以在安装前通过 CARGO_HOMERUSTUP_HOME 分别进行配置。注意,此时配置文件路径同时修改为 $CARGO_HOME/config 文件。

另外,在 1.38 版本之后,需要将 config 修改为 config.toml 文件。

Rustup 工具集除了上述的默认配置外,还可以参考 Overrides 中的介绍。

编译优化

通过 cargo build --timings 或者 cargo +nightly build -Ztimings 可以查看项目的编译耗时,结果在 target/cargo-timings 目录下,其中橙色是 build.rs 自定义编译,薰衣草色是 codegen 耗时。

依赖管理,默认会将所有的依赖进行编译,即使实际代码没有使用,可以通过 cargo-udeps 或者 cargo-machete ,区别是前者检查会进行编译,对于 CI 不太友好,而后者通过正则处理,有时候可能会误判。

连接器

默认的 GCC gold 连接器耗时比较长,可以通过 LLVM lld 甚至 mold 进行优化。在 ~/.cargo/config.toml 中添加如下内容。

[target.x86_64-unknown-linux-gnu]
linker = "clang-17"
rustflags = ["-C", "link-arg=-fuse-ld=/usr/bin/mold"]

在 Fedora 中可以通过 yum install clang17 mold 安装 clang 编译器。

其中具体的平台架构可以通过 rustup toolchain list 简单查看,相关配置通过 rustc +nightly -Zunstable-options --print all-target-specs-json 命令查看。

缓存

缓存中间结果,类似 ccache 的功能,可以通过 rust-cache 或者 sccache 实现,前者在 CI 中使用比较多,这里介绍后者,除了 Rust 之外,在 C/CPP 中也可以使用。

通过 cargo install sccache 安装,默认缓存在 ~/.cache/sccache 目录下,可以通过 SCCACHE_DIR 配置。使用时可以通过 export RUSTC_WRAPPER=/path/to/sccache 设置环境变量,或者在 Cargo.toml 以及本地的 config.toml 中添加如下内容。

[build]
rustc-wrapper = "/path/to/sccache"

可以通过 sccache --show-stats 查看缓存的统计。

其它

随着 Crate 数量越来越多,单纯的索引成本已经比较高,可以通过如下方式设置稀疏索引。

[registry.crates-io]
protocol = "sparse"

可以通过 RUSTFLAGS="-Cincremental=true" cargo run 环境变量,或者上述在 config.toml 类似的方式配置编译参数,不过增量编译不太好用。

常用工具

Cargo 很多自命令可以通过 cargo --list 查看,如下是常用的命令:

  • cargo tree 打印包的依赖树。
  • cargo fmt 官方提供的格式化工具,

三方工具

除了自带的标准命令之外,还可以通过 cargo install 方式安装一些三方的插件,通常是命令行,以 cargo-xxx 方式命名,例如代码覆盖率工具 tarpaulin 可以通过如下方式安装。

cargo install cargo-tarpaulin

会安装到 $CARGO_HOME/bin 目录下,默认为 ~/.cargo/bin 目录。

  • tarpaulin 代码覆盖率工具,可以生成命令行、页面等结果。
  • nextest 相比原生的测试输出要更加漂亮。
  • tokei 代码统计工具,注意,安装后这个命令是独立运行的,例如 tokei -t=Rust dir

三方库

  • criterion.rs 性能压测常用库,其中 Tokio 在使用。
  • derive_builder 通过注解方式引入 Builder 模式,