二、rust cargo

一、cargo是什么

Cargo是Rust的构建工具和包管理器。
Cargo除了具有创建工程、构建工程、运行工程等功能,还具有下载依赖库、编译依赖等功能。
真正编写程序时,我们不直接用rustc,而是用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, <0.0.4,然后使用这个范围内最大的版本。
rand = "^1.2"
表示版本范围是 >=1.2.0, <1.3.0,然后使用这个范围内最大的版本。
hammer = {version = "^0"}
表示版本范围是>=0.0.0, <1.0.0,然后使用这个范围内最大的版本。

(3)版本号使用~
使用~可以指定一个版本号范围,然后使用该范围内的最小版本号。
例子

regex = "~1.2.3"
表示版本范围是 >=1.2.3, <1.3.0,然后使用这个范围内最小的版本。
rand = "^1.2"
表示版本范围是 >=1.2.0, <1.3.0,然后使用这个范围内最小的版本。
hammer = {version = "~1"}
表示版本范围是>=1.0.0, <2.0.0,然后使用这个范围内最小的版本。

(4)版本号使用*
*是通配符,能替换成任何数字:
例子

regex = "*"
表示版本范围是 >=0.0.0,然后使用这个范围内最大的版本。
rand = "1.*"
表示版本范围是 >=1.0.0, <2.0.0,然后使用这个范围内最大的版本。
hammer = {version = "1.2.*"}
表示版本范围是>=1.2.0, <1.3.0,然后使用这个范围内最大的版本。

(5)版本号使用比较符
可以使用比较符指定一个版本号范围或一个精确的版本号:

>= 1.2.0
> 1
< 2
= 1.2.3

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

>= 1.2, < 1.5

例子

regex = ">= 1.2.0"
表示版本范围是 >=1.2.0,然后使用这个范围内最大的版本。
rand = "< 2"
表示版本范围是 >=0.0.0, <2.0.0,然后使用这个范围内最大的版本。
hammer = {version = ">= 1.2, < 1.5"}
表示版本范围是>= 1.2, < 1.5,然后使用这个范围内最大的版本。

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无法使用镜像。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值