Rust 是一种多范式、高级、通用编程语言,专为性能和安全而设计,尤其是在安全的并发方面。在今天的文章中,我们使用 Rust nightly
。您也可以添加更多目标,例如 stable
或 beta
,但我们将向您展示在 Travis 上使用 Rust 构建时利用缓存的强大功能。
Rust 构建通常很慢,尤其是在从空白状态编译时。虽然这种情况比过去有所改善,但它仍然慢到足以成为 CI 系统的重大问题。因此我想,为什么不写一些东西来帮助未来使用 Travis 的 Rust 构建者呢?
实际上,你做得很好。好消息是,我们可以使用 cache: cargo
,以及一些其他方法来帮助加快 Rust 的构建速度。例如,看看我写的这个 .travis.yml
文件
---
cache: cargo
dist: xenial
language: rust
matrix:
allow_failures:
- rust: nightly
before_cache:
- rm -rf ~/.cargo/registry/index/ # Remove cache files
- rm -f ./target/.rustc_info.json # Remove more cache files that are recursively brought back upon a triggered build
- find ./target/debug -maxdepth 1 -type f -delete # Delete loose files
fast_finish: true
os: linux
rust:
- stable
- beta
- nightly
script:
- "cargo build --verbose --all"
- "cargo test --verbose --all"
我们在这里针对 3 个 Rust 通道进行测试,在某些情况下,nightly
会由于编译器而失败,但由于这篇文章是关于加快构建速度的,您会注意到我添加了一个条件,即只允许一个 Rust 通道出现错误,那就是 nightly
matrix:
allow_failures:
- rust: nightly
您会注意到 stable
和 beta
没有与 nightly
一起列出。现在,由于速度是这篇文章的重点,您可能希望禁用 Cargo 的增量编译,因为它不会给构建带来更多详细程度,所以让我们尝试删除它,以获得更快的构建速度。为此,您需要将 CARGO_INCREMENTAL
环境变量设置为 0
。
现在,让我们创建一个测试文件,这里有一些 Rust 代码,您可以随意命名它,在本例中,您可以看到我们把文件命名为 test_run
extern crate test_run;
use logic_gates::{and, xor};
pub type Sum = u8;
pub type Carry = u8;
pub fn half_adder_input_output() -> Vec<((u8, u8), (Sum, Carry))> {
vec![
((0, 0), (0, 0)),
((0, 1), (1, 0)),
((1, 0), (1, 0)),
((1, 1), (0, 1)),
]
}
fn half_adder(a: u8, b: u8) -> (Sum, Carry) {
(xor(a, b), and(a, b))
}
#[test]
fn one_bit_adder() {
for (inn, out) in half_adder_input_output() {
let (a, b) = inn;
assert_eq!(half_adder(a, b), out);
}
}
看起来很棒,构建者,现在让我们看看我们有什么
.travis.yml
文件0
的一些提示matrix
构建(多个平台和 Rust 版本)来测试稳定版 Rust 版本和它们各自的 Rust 编译器在不同平台上的 nightly 构建。正如我之前所说,您会发现 nightly 构建可能会失败,因为这些编译器不是最终版本,可能存在错误,因此如果仅仅是 nightly 构建出现错误,不要将其标记为构建的整体失败。正如 Travis 官方文档所述,Travis 当前检查 ~/.cargo
和 target/
中是否有任何来自当前缓存的更改。您必须注意,如果源代码发生更改, target/
中将始终存在更改,这种情况通常发生在 Travis 构建运行时。这意味着每次构建都会将新的增量对象文件、指纹和构建脚本编译文件添加到缓存中,并且构建次数越多,杂乱就越多!您会注意到我添加了一个 before_cache
部分,在这个部分中我添加了
before_cache:
- rm -rf ~/.cargo/registry/index/
- rm -f ./target/.rustc_info.json
- find ./target/debug -maxdepth 1 -type f -delete
这将有助于子程序,并加快您使用 Rust 时的构建速度,现在您应该拥有一个可以正常工作的构建!您可以将今天在这里阅读的一些方法应用于更大规模的项目,这仅仅是实现各种加快 Travis 上 Rust 构建速度的方法的一个小示例。
如果您有任何问题,请发送电子邮件至 [email protected],我会回答所有问题!
构建愉快!