二、rust cargo

慈云数据 2024-05-09 技术支持 45 0

一、cargo是什么

Cargo是Rust的构建工具和包管理器

二、rust cargo
(图片来源网络,侵删)

Cargo除了具有创建工程、构建工程、运行工程等功能,还具有下载依赖库、编译依赖等功能。

真正编写程序时,我们不直接用rustc,而是用cargo。

二、rust cargo
(图片来源网络,侵删)

二、使用cargo

(一)使用Cargo创建项目

回到projects目录。运行以下命令:

$ cargo new hello_cargo
$ cd hello_cargo

cargo new命令新建了名为hello_cargo的目录。

目录结构如下

$ tree .
├── .git
├── .gitignore
├──Cargo.toml
└──src
    └──main.rs

源文件存放在src目录中。

项目根目录只存放README、license信息、配置文件等跟代码无关的文件。

现在打开src/main.rs看看:

fn main() {
     println!("Hello, world!");
}

(二)构建并运行Cargo项目

1.分别构建和运行

使用cargo build

在hello_cargo目录下,输入下面的命令来构建项目:

$ cargo build

这个命令会创建一个可执行文件target/debug/hello_cargo。由于默认的构建方法是调试构建(debug build),Cargo会将可执行文件放在名为debug的目录中。

运行可执行文件:

$ ./target/debug/hello_cargo

2.同时构建和运行

使用cargo run

可以使用cargo run在一个命令中同时编译并运行生成的可执行文件:

$ cargo run

使用cargo run方便得多,所以大多数开发者会使用cargo run。

3.只检查错误

使用cargo check

该命令快速检查代码确保其可以编译,但并不产生可执行文件:

$ cargo check

为什么不需要可执行文件呢?因为只是检查错误,不必生成可执行文件,cargo check要比cargo build快得多

(三)发布(release)

可以使用cargo build --release来发布项目。这会在target/release而不是target/debug下生成可执行文件。

这可以让Rust代码运行的更快,不过也需要消耗更长的编译时间。

这也就是为什么会有两种不同的配置:一种是为了开发,你需要经常快速重新构建;另一种是为用户构建最终程序,它们不会经常重新构建,并且希望程序运行得越快越好。

(四)添加依赖包

在Cargo.toml文件中的[dependencies]下添加依赖包。

像下面这样:

[dependencies]
regex = "0.1.41"

[dependencies],是依赖片段。表明下面语句都是需要的依赖。

有三种添加依赖的方法:

1.添加官方仓库的依赖

(1)版本号不使用任何运算符

版本号符合 “x.y.z” 的形式,其中x称为主版本major, y称为小版本minor,而z称为补丁patch,从左到右,版本的影响范围逐步降低

例子

rand = "0.3"
hammer = { version = "0.5.0"}

(2)版本号使用^

如果版本号不使用任何运算符,那么就相当于使用了^。

使用^可以指定一个版本号范围,然后使用该范围内的最大版本号。

例子

regex = "^0.0.3"
表示版本范围是 >=0.0.3, =1.2.0, =0.0.0, =1.2.3, =1.2.0, =1.0.0, =0.0.0,然后使用这个范围内最大的版本。
rand = "1.*"
表示版本范围是 >=1.0.0, =1.2.0, = 1.2.0
> 1
 

同时还能组合比较符,并通过逗号分隔:

>= 1.2,  

例子

regex = ">= 1.2.0"
表示版本范围是 >=1.2.0,然后使用这个范围内最大的版本。
rand = "=0.0.0, = 1.2,  

2.添加第三方仓库的依赖

指定git仓库地址

例子

color = { git = "https://github.com/bjz/color-rs" }

由于没有指定版本,Cargo会假定我们使用main分支的最新commit。

你可以使用rev、tag或branch来指定想要拉取的版本。例如下面代码拉取了next分支上的最新commit:

[dependencies]
regex = { git = "https://github.com/rust-lang/regex", branch = "next" }

任何非tag和branch的类型都可以通过rev来引入,例如通过最近一次commit的哈希值引入: rev = “4c59b707”,再比如远程仓库提供的的具名引用: rev = "refs/pull/493/head"。

3.添加本地的依赖

指定绝对路径或者相对路径

例子

geometry = { path = "crates/geometry" }

一般来说,本地依赖包都是同一个项目内的内部包,例如假设我们有一个 hello_world 项目,现在在其根目录下新建一个包:

# 在hello_world/ 目录下
$ cargo new hello_utils

新建的 hello_utils 文件夹跟 src、Cargo.toml同级,现在修改Cargo.toml让hello_world项目引入新建的包:

[dependencies]
hello_utils = { path = "hello_utils" }
# 以下路径也可以
# hello_utils = { path = "./hello_utils" }
# hello_utils = { path = "../hello_world/hello_utils" }

在Cargo.toml文件中添加依赖之后,Cargo会获取依赖以及依赖的依赖,编译并生成 Cargo.lock,Cargo.lock中包含了所有依赖的版本信息。未来就算regexp的作者升级了该包,我们依然会下载Cargo.lock中的版本,而不是最新的版本,只有这样,才能保证项目依赖包不会因为更新导致无法编译。当然,你还可以使用cargo update来手动更新包的版本

三、配置cargo

官方仓库的地址默认是crates.io,是由Rust官方提供的,用户可以在其中寻找和下载所需的包。cargo默认就是从这里下载依赖包。但是国内访问不了。

可以修改为国内的镜像地址。

cargo配置文件为

Windows系统默认为:%USERPROFILE%\.cargo\config

Linux系统默认为:$HOME/.cargo/config

在配置文件里添加如下代码

[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"

注意,cargo search无法使用镜像。

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon