以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」mp.weixin.qq.com/s/ceMTUzRjD…
这几年 Rust 可谓是炙手可热的新式编程言语了,而且被投票为最受程序员喜欢的言语。它很现代,专门为了性能、可靠和生产力而设计,说人话便是非常快,不容易崩溃,开发效率高。
那么,如此热门的计算机言语,它怎样去构建软件和办理构建工程呢?
Rust 言语的开发团队供给了规范计划,运用 rust 自带的一个包 Cargo 协助开发人员灵敏高效地构建代码。Cargo 供给下载林林总总的库或许工程依靠项,发布自己的包和上传到 crates.io 共享给全部开发者等。
下面让咱们一同来看看什么是 cargo,它能够怎样协助咱们开发者构建自己的 rust 工程。关于怎样安装 rust 和 cargo 相关能够查看八戒的另一篇文章《简明快速装备 Rust 东西链》。
本文以下演示都是依据 ubuntu 18.04.6。
手动构建和运行
先来看看直接运用 rust 的编译器 rustc 编译 hello world 示例。预备一个 rust 源码文件,输入以下内容
fn main() {
println!("Hello rust world!");
}
rust 源码文件的后缀为 (.rs),所以上面的文件保存为 hello.rs。
调用 rustc 编译文件 hello.rs
$ rustc hello.rs
编译没有错误回来意味着成功完毕,这时生成了可履行文件 hello,与输入源文件同名
$ ll
total 4544
drwxrwxrwx 1 user user 512 Nov 14 00:55 ./
drwxrwxrwx 1 user user 512 Nov 14 00:54 ../
-rwxrwxrwx 1 user user 4652168 Nov 14 00:55 hello
-rwxrwxrwx 1 user user 50 Nov 14 00:54 hello.rs
再手动履行文件 hello 看看输出
$ ./hello
Hello rust world!
这样的构建过程,全部挺顺畅的,尤其是咱们突然灵光一闪,脑袋有个想法需要快速验证时,这样也不错。但是这只是编译了一个源码文件,要是咱们的开发工程反常巨大,源码文件去到上百上千个文件时,再运用编译器 rustc 手动编译真的太费力啦。就好像现在的大型 C/C++ 工程基本都用 cmake 办理一样,咱的 rust 工程有 cargo。
创立一个 package
Cargo 是 rust 团队的指定构建体系和包办理器,能够运用它快速创立一个空的 package 工程,履行构建的时分 cargo 会依据装备文件内容主动下载依靠项等。相信大伙在碰到 rust 的另一个概念 crate 是会感到很困惑,其实一般情况下 package 都能够被作为是 crate,便是说能够交换。
下面来看看怎样创立新 package 工程
$ cargo new hello_rust
Created binary (application) `hello_rust` package
上面示例运用了 cargo new 指令创立一个姓名是 hello_rust 的新 package 工程,然后用 tree 指令看看都主动创立了哪些文件和途径
$ cd hello_rust/
$ tree .
.
├── Cargo.toml
└── src
└── main.rs
1 directory, 2 files
能够看到有个 Cargo.toml 文件,它是 cargo 构建 package 工程的装备文件,不过看起来有点生疏,先继续看其它内容。
在 src 文件夹下有个 rust 源码文件 main.rs,翻开看看里面的内容
$ cat src/main.rs
fn main() {
println!("Hello, world!");
}
本来 main.rs 包括了一个 hello world 的示例代码,真的是一步到位。
回过头来再看 Cargo.toml
$ cat Cargo.toml
[package]
name = "hello_rust"
authors = ["ENG八戒"]
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
能够看到文件 Cargo.toml 内包括了多个 section,比方 package、dependencies。
在 package 字段,包括了工程的姓名 name,作者 authors,工程版别 version,rust 版别等。格式是键值对的方式,= 后边的值用 [] 界定表示该值类型是列表的方式,内容能够是多个,比方软件工程的作者就能够有多个。
而 dependencies 字段用于填写该工程的依靠项,依靠项便是咱们在开发软件时,有许多的内容能够直接借用他人的效果,或许防止浪费自己的时间重复造轮子。而他人的效果通常以包的方式供给,咱们只需要在这个装备文件的 dependencies 字段里填写对应的包信息。
假设依靠项中包括发生随机数的 rand 包,能够如下填写
...
[dependencies]
rand = "0.8.5"
上面填写的依靠项内容不只有包名,还有具体的版别。但是,咱们怎样知道现时有哪些具体的包和版别呢?
能够用 cargo search 指令,后边加上对应的含糊包名,这样 cargo 就会从 crates.io 查找可用包并打印,你再从中选一个适宜的
$ cargo search rand
rand = "0.8.5" # Random number generators and other randomness functionality.
bevy_rand = "0.4.0" # A plugin to integrate rand for ECS optimised RNG for the Bevy game engine.
tinyrand = "0.5.0" # Lightweight RNG specification and several ultrafast implementations in Rust.
random_derive = "0.0.0" # Procedurally defined macro for automatically deriving rand::Rand for structs and enums
tera-rand = "0.2.0" # A suite of random data generation functions for the Tera template engine
tera-rand-cli = "0.2.0" # A CLI tool for generating a feed of random data from a Tera template
faker_rand = "0.1.1" # Fake data generators for lorem ipsum, names, emails, and more
rand_derive2 = "0.1.21" # Generate customizable random types with the rand crate
fake-rand-test = "0.0.0" # Random number generators and other randomness functionality.
ndarray-rand = "0.14.0" # Constructors for randomized arrays. `rand` integration for `ndarray`.
... and 1219 crates more (use --limit N to see more)
未完待续…