RustCoobook(译):深入潜入Cargo(第三章)(完+1)
在本章中,我们将介绍以下配方:
- 使用Cargo创建新项目
- 从crates.io下载外部包
- 用于现有的Cargo项目
- 用Cargo运行测试
- 项目的配置管理
- 在Travis CI上构建项目
- 上传到crates.io
介绍
Cargo是Rust的独特卖点之一,它是系统编程领域的第一个此类卖点。 Cargo是Rust的软件包管理器,它使开发人员在创建,开发,打包,维护,测试和部署应用程序代码或工具到生产方面变得轻松,而且不费吹灰之力。 在本章中,我们将介绍使开发人员能够利用Cargo的所有功能并从开发的第一天开始生产生产级Rust应用程序的配方。
使用Cargo创建新项目
Cargo是Rust的独特产品,在系统编程领域是一个非常新的产品。 它也是Rust的卖点之一,因为它使开发人员能够打包,推送和测试他们的Rust应用程序。
我们将在本章介绍Cargo的许多功能。
做好准备
我们需要Rust编译器,Cargo和任何文本编辑器进行编码。
怎么做…
1.打开终端。
2.转到要创建项目的目录:
cd project_location
3.输入以下命令以创建新的Rust项目:
cargo new project_name --bin
创建一个名为hello_world的项目,如以下示例所示:
cargo new hello_world --bin
你应该得到以下输出:
4.您应该使用项目名称创建一个新文件夹。
首先,进入项目并检查它:
cd hello_world
tree .
你应该得到以下输出:
这是新创建的项目的整个结构。
5.使用Linux中的cat命令打印Cargo.toml文件的内容:
cat Cargo.toml
你应该得到以下输出:
6.转到项目内的src目录,在该目录中找到默认的main.rs文件,并使用Linux中的cat命令打印其内容:
cd src
cat main.rs
你应该得到以下输出:
7.构建cargo new命令附带的示例项目:
cargo build
你应该得到以下输出:
- Cargo构建将创建一个名为target的新目录和一个名为cargo.lock的文件。
运行已编译的项目,该目录是目标目录中的可执行文件。
. project_directory/target/debug/hello_world
由于这是一个可执行文件,您应该能够看到应用程序的输出。
你应该得到以下输出:
9.我们必须按照前面两个步骤来构建可执行代码,然后执行Rust应用程序,但是使用Cargo命令我们可以同时执行:
cd project_location
cargo run
你应该得到以下输出:
怎么运行的…
Cargo是一个命令行工具,随Rust的安装一起提供。 这一点至关重要,原因如下:
- 它引入了传达项目所有细节的元数据文件
- 它调用了rustc编译器来构建项目
- 它有助于开发人员更好地构建和维护代码
Cargo new 命令为我们创建完整的文件夹结构。 对于我们的项目, - bin表示二进制文件。 这意味着我们正在创建一个Rust应用程序,该应用程序可以在解决实际问题方面开箱即用。 但是,在这种情况下,我们创建了一个不使用–bin选项作为命令行工具的库。 库也用于创建在rust中。 我们将在接下来的章节中稍后在Rust中创建一个库。
Cargo.toml是一个清单文件,其中包含Cargo编译项目所需的所有元数据。 当您运行 cargo build 命令时,您将看到源代码被转换为可执行字节代码,这将是最终应用程序; 这将创建目标目录并将可执行文件放在其中的调试文件夹中。 在debug文件夹中,我们主要有deps目录,其中包含为执行应用程序而下载的不同依赖包。
您的项目可以选择包含名为example,test和bench的文件夹,Cargo将分别视为包含示例,集成测试和基准测试。
Rust非常智能,只有在代码发生变化时才会编译。
在调试模式下编译cargo build - 发布适用于开发,并且编译时间较短,因为编译器不进行任何优化和检查。 但是,当您在发布模式下运行代码时,编译需要更长时间,但代码将在生产中运行得更快。 发布模式将在目标内的release文件夹而不是debug目录中准备构建。
我们看到构建过程创建了一个Cargo.lock文件。 此文件包含有关依赖项的所有信息。 我们将在即将发布的食谱中详细介绍此文件。
为了在同一个Rust项目中编译多个二进制文件,我们必须在Cargo.toml文件中创建某些条目,我们在其中明确提到了我们要构建的目标。 默认情况下,Cargo使用相同的项目名称编译src文件夹中的main.rs文件,但是为了编译需要构建的多个二进制文件,例如守护进程和客户端,我们在Cargo.toml中进行以下提及更改。 文件:
这将构建另外两个名为守护进程和客户端的二进制文件以及项目二进制文件。
类似地,我们可以在配置文件中包含诸如[lib],[[bench]],[[test]]和[[example]]之类的部分来构建库,基准测试,测试和示例。
[[bin]]
name = "daemon"
path = "src/daemon/bin/main.rs"
[[bin]]
name = "client"
path = "src/client/bin/main.rs"
从crates.io下载外部包
要创建复杂的应用程序来解决实际问题,我们需要重用其他开源项目和依赖项来加快开发速度。
https://crates.io/是Rust社区的中央存储库,用作发现和下载包的位置。 命令行工具货物配置为查找请求的包并下载和使用它们。 您将学习如何在此配方中下载和维护外部包(依赖项)。
做好准备
我们需要Rust编译器,Cargo和任何文本编辑器进行编码。
怎么做…
1.在您喜欢的文本编辑器中打开Cargo.toml文件; 在这个配方中,我们将使用nano编辑器:
nano Cargo.toml
你应该得到以下输出:
2.在cargo.toml文件中添加[dependencies]部分,并在其下面输入time =“0.1.12”和regex =“0.1.41”。
你应该得到以下输出:
3.使用cat命令查看配置列表:
cat Cargo.toml
你应该得到以下输出:
4.构建项目以从https://crates.io/中提取依赖项:
cargo build
你应该得到以下输出:
5.使用我们项目中提取的现有板条箱。
使用nano打开src目录中的main.rs文件并输入以下代码:
nano main.rs
你应该得到以下输出:
// Declare the external crate(声明外部库)
extern crate regex;
use regex::Regex;
fn main() {
let check_date = Regex::new(r"^\d{4}-\d{2}-\d{2}$").unwrap();
println!("Did our date match? {}", check_date.is_match("2017 -02-01"));
}
您应该获得以下状态输出:
6.编译并运行项目:
cargo run
你应该得到以下输出:
怎么运行的…
我们在Cargo.toml文件中输入项目所需的依赖项。 该文件将获取https://crates.io/中央存储库中提到的包和版本。 在前面的配方中,我们下载了时间和正则表达式包,并且还提到了我们想要处理的所需版本。
当我们在修改Cargo.toml文件之后构建项目时,它会下载本地开发系统的crate中的所有模块,并在Cargo.lock文件中创建一个条目,该文件将包含有关下载的依赖项的所有详细信息。
如果您计划创建库或改进现有库实现,建议您检查是否在https://crates.io/中实现了任何类似的想法或项目,以评估您的打开项目的价值。 https://crates.io/存储库中的所有项目都是GitHub上提供的开源项目。
使用其他依赖项的有趣之处在于,您可以重用要在项目中使用的应用程序或函数的可用工作版本,并缩短项目开发时间。
我们在Rust脚本中使用extern crate命令来调用下载的包。
extern crate regex或crate并在其拥有的模块中导入其所有功能。 然后我们通过传递数据在代码中调用它们。
在前面的代码片段中,我们明确提到需要使用use命令使用regex :: Regex调用regex crate中的Regex模块并检查日期是否匹配并在终端中打印布尔值。
我们调用unwrap和is_match函数来检查两个字符串是否相同。 如果它们相似则返回true,否则返回false。
工作在现有的 Cargo 项目
Cargo是一个工具,它允许Rust应用程序声明它们的各种依赖项,以确保您能够通过遵循相同的依赖项和版本来重新创建构建。
在更高的层次上,它为Rust项目提供配置管理,并有助于重现开发环境。 通常,在其他语言中,维护不同的依赖关系并在每次我们在不同的环境中部署应用程序时配置它们是一个非常繁琐且耗时的过程。
Cargo提供开箱即用的功能,使开发人员和项目经理能够非常快速地运送/部署Rust项目/应用程序,而且没有太多麻烦; 与其他语言相比,这是一个非常大的优势。
做好准备
我们需要Rust编译器,Cargo和任何文本编辑器进行编码。
怎么做…
1.从本配方中的项目仓库中克隆项目。 从托管它的GitHub关闭rand crate。 通过在终端中键入以下命令来执行此操作:
git clone https://github.com/rust-lang-nursery/rand.git
你应该得到以下输出:
这会将repo从GitHub克隆到本地系统
2.输入新创建的项目rand并查看复杂的生产级别
包装细节:
cd rand/
tree .
你应该得到以下输出:
3.使用Cargo构建命令构建项目:
cargo build
你应该得到以下输出:
怎么运行的…
前面三个步骤将在您的本地开发环境中设置一个完整的Rust项目。 这是Cargo命令行工具的强大功能,它使开发人员的后期开发应用程序生命周期变得如此简单。
在这里,我们基本上克隆了一个现有项目并构建它。 Cargo查看了清单文件,以获取了解项目的各种依赖关系并构建它们所需的所有元数据。
用Cargo运行测试
测试对于复杂的生产级应用非常重要,因为它们验证了项目功能单元的工作。 Cargo为Rust提供了所有测试功能,有助于开箱即用的单元和集成测试。
做好准备
我们需要Rust编译器,Cargo和任何文本编辑器进行编码。
怎么做…
1.在项目内运行货物测试命令:
cargo test
你应该得到以下输出:
2.提到运行特定测试货物测试test_name的名称:
cargo test foo
你应该得到以下输出:
怎么运行的…
Cargo寻找在两个地方运行的测试:它们位于src目录中,我们可以在其中放置单元测试代码,以及我们放置集成测试的tests目录。
在这个配方中,我们没有对该项目进行任何测试,但我们稍后会有一个专门的测试章节,我们将深入探讨测试的各个方面。
项目的配置管理
我们将在本文中深入探讨Cargo.lock和Cargo.toml的使用,我们将看到它们如何帮助进行配置管理。
此处的配置管理是指具有版本控制的能力,包括上载和下载所需版本的项目依赖项。
做好准备
我们需要Rust编译器,Cargo和任何文本编辑器进行编码。
怎么做…
1.转到hello_world项目并在Cargo.toml文件中输入rand库的GitHub repo链接:
cd hello_world
nano Cargo.toml
在以下Cargo.toml中,输入提到的依赖项:
rand = { git = "https://github.com/rust-lang-nursery/rand.git"
}
你应该得到以下输出:
2.在同一个Cargo.toml文件中,输入rev和rand crate的SHA值。
你应该得到以下输出:
3.键入cargo update命令以实现新更改:
cargo update
你应该得到以下输出:
4.输入Cargo.lock并查看rand包详细信息。
你应该得到以下输出:
切勿在Cargo.lock文件中进行任何手动更改。 它不打算手动编辑。
怎么运行的…
cargo解析清单文件数据,并根据输入的数据执行某些任务。
首先,我们在Cargo.toml文件中输入项目的GitHub repo链接以安装特定的包。 由于我们没有提及任何其他细节 - 例如,哪个版本 - Cargo会将最新提交的所有模块和资源提取到项目的主分支。
但是,这种方法的问题在于,如果项目明天更改其布局或代码,我们当前的实现可能会在更新软件包时受到影响。
为避免这种情况,我们将rev值分配给项目的提交ID,该项目的资源我们已用于当前构建。 这似乎解决了我们的问题,但我们仍然需要记住提交ID,当我们输入错误的ID时,这很容易出错。
使用nano命令输入Cargo.lock。 由于锁定文件存在,我们不需要手动跟踪依赖项的修订。 Cargo将在Cargo.lock文件中创建条目,其中包含应用程序中使用的每个软件包的修订详细信息。
当您第一次构建时,Cargo将采用最新的提交并将该信息写入Cargo.lock。 想象一下,我们将项目运送到我们想要配置Rust应用程序的新主机。 Cargo将使用Cargo.lock文件中的确切SHA,即使您不应该在Cargo.toml文件中提及它。 我们可以看到锁文件中有很多关于包的信息,这将有助于我们以后重现相同的依赖关系。
在Travis CI上构建项目
Travis CI是一个连续集成的软件,可以读取项目存储库中的yml文件。 它为工具提供有关如何构建,测试和发布的说明或命令。
在本文中,您将学习如何使用TravisCI工具构建Rust应用程序,该工具的代码托管在GitHub上。
做好准备
我们需要Rust编译器,Cargo和任何文本编辑器进行编码。 在GitHub仓库中托管Rust应用程序,并将TravisCI工具集成到GitHub仓库。
怎么做…
1.使用touch命令在项目中创建.travis.yml文件:
cd project_location
touch .travis.yml
2.通过使用任何文本编辑器打开文件,输入以下配置以在不同的Rust版本中测试应用程序; 我们在这个配方中使用纳米:
nano .travis.yml
language: rust
rust:
- stable
- beta
- nightly
matrix:
allow_failures:
- rust: nightly
你应该得到以下输出:
3.在项目中进行更改,并将项目推送到GitHub仓库。
每次我们在项目存储库中推送提交时,都会在TravisCI平台上触发构建过程。 此过程可通过TravisCI平台中提供的高级选项进行配置,您可以在其中安排构建或选择要构建的repo分支。
您应该在Travis CI平台中获得以下屏幕截图作为输出:
怎么运行的…
Travis CI工具读取项目的.travis.yml文件中指定的指令,并准备要在其中构建,测试和发布项目的环境。 在下一节中,我们将分解并理解构建管道中每个命令的作用:
language: rust
这将在安装机器时下载并安装最新的稳定版Rust版本。 如果您只想在稳定版本中测试应用程序,则只需要上述命令,无需指定版本:
rust:
- stable
- beta
- nightly
要指定要在其中测试应用程序的版本,可以使用前面的命令,在beta和nightly通道中构建项目。 即使您只是定位稳定,Rust团队也鼓励您在其他渠道上进行测试:
matrix:
allow_failures:
- rust: nightly
这将测试所有三个通道,并且夜间的任何破损都不会使您的整体失败
建立。
在前面的构建日志中,如果仔细观察,您将看到默认测试脚本由Travis CI运行,它使用Cargo工具运行构建并使用货物构建和货物测试命令测试应用程序。
上传到crates.io
https://crates.io/是一个网站,作为托管由令人惊叹的Rust社区制作的所有板条箱的中央存储库。 它包含各种领域的各种项目。 这有助于立即发布箱子并安装它们。
做好准备
我们需要Rust编译器,Cargo和任何文本编辑器使用GitHub ID在https://crates.io/网站上编码和创建帐户。
怎么做…
1.转到要将项目上载到https:// crat的项目位置
es.io/:
cd project_location
2.当您创建新帐户或使用现有GitHub ID登录时,https://crates.io/在帐户设置页面上提供API令牌:
cargo login API_TOKEN
3.打包Rust应用程序:
cargo package
4.将Rust应用程序发布到https://crates.io/:
cargo publish
怎么运行的…
Cargo login命令获取提供的API令牌并将其存储在〜/ .cargo / config位置。
请注意,API令牌应保密,不应共享,因为这是我们管理上传的包装箱的方式。
请记住,您用于创建项目的名称将是包的名称,包装箱的名称基于先到先得的原则。
当我们的项目准备好打包时,我们使用上面的步骤创建一个名为/ target / package的新文件夹。
包内的内容将上传到https://crates.io/网站。 将有一个文件,其命名约定为project_name-version.crate,文件夹为project_name-version。 这些名称基于开发商提供给cargo.toml的信息。 我们可以调整配置文件中的值并使用package命令,直到我们获得正确的名称和版本号。
在打包时,我们必须确保不上传用于测试库的不必要的文件,例如测试脚本或文本文件等。 为此,* .crate文件提供了许多标记或键,用于说明文件的各种功能,示例和资源:
[package]
# ...
exclude = [
"public/assets/*",
"videos/*",
] #
...
include = [
"**/*.rs",
"Cargo.toml",
]
在上一节中,我们明确提到要排除资产和视频文件夹中的所有资源; 另一方面,我们有一个名为include的标签,有助于确保打包所有重要文件。
最终命令货物发布查看* .crate文件并在创建的帐户中发布包。