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文件

像下面这样:

复制代码
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
[dependencies]
regex = "0.1.41"

这个文件使用TOML (Tom's Obvious, Minimal Language) 格式,这是Cargo配置文件的格式。

package\],是包片段,表明下面的语句用来配置包。 接下来的三行是包的名称、包的版本、使用的Rust版本。 \[dependencies\],是依赖片段。表明下面语句都是需要的依赖。 在Cargo.toml文件中添加依赖之后,Cargo会获取依赖以及依赖的依赖,编译并生成 Cargo.lock,Cargo.lock中包含了所有依赖的版本信息。未来就算regexp的作者升级了该包,我们依然会下载Cargo.lock中的版本,而不是最新的版本,只有这样,才能保证项目依赖包不会因为更新导致无法编译。当然,你还可以使用cargo update来手动更新包的版本 有三种添加依赖的方法: 1.添加官方仓库的依赖 指定版本号 例子 rand = "0.3" hammer = { version = "0.5.0"} 版本号符合 "x.y.z" 的形式,其中x称为主版本major, y称为小版本minor,而z称为补丁patch,从左到右,版本的影响范围逐步降低 \^ 指定版本 与 "x.y.z" 不同, \^ 可以指定一个版本号范围,然后会使用该范围内的最大版本号。 ^1.2.3 := >=1.2.3, <2.0.0 ^1.2 := >=1.2.0, <2.0.0 ^1 := >=1.0.0, <2.0.0 `~ `指定版本 `~ `使用该范围内的最小版本号 : ~1.2.3 := >=1.2.3, <1.3.0 ~1.2 := >=1.2.0, <1.3.0 ~1 := >=1.0.0, <2.0.0 `* `通配符 这种方式允许将 \* 所在的位置替换成任何数字: * := >=0.0.0 1.* := >=1.0.0, <2.0.0 1.2.* := >=1.2.0, <1.3.0 不过crates.io并不允许我们只使用孤零零一个 \* 来指定版本号 : \*。 比较符 可以使用比较符指定一个版本号范围: >= 1.2.0 > 1 < 2 = 1.2.3 同时还能组合比较符,并通过逗号分隔: >= 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 官方仓库的地址默认是crates.io,是由Rust官方提供的,国内访问不了。 可以修改为国内的镜像地址。 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无法使用镜像。

相关推荐
Kookoos2 分钟前
【实战】基于 ABP vNext 构建高可用 S7 协议采集平台(西门子 PLC 通信全流程)
后端·物联网·c#·.net
帮帮志6 分钟前
vue3与springboot交互-前后分离【完成登陆验证及页面跳转】
spring boot·后端·交互
User_芊芊君子14 分钟前
【Java面试题】——this 和 super 的区别
java·开发语言
柴薪之王、睥睨众生15 分钟前
(自用)Java学习-5.8(总结,springboot)
java·开发语言·spring boot·学习·mybatis
牛马baby16 分钟前
Java高频面试之并发编程-17
java·开发语言·面试
让我们一起加油好吗16 分钟前
【C++】模板(初阶)
开发语言·c++·visualstudio·模板·泛型编程
灏瀚星空1 小时前
基于Python的量化交易实盘部署与风险管理指南
开发语言·python
Run_Teenage1 小时前
C++类和对象:运行符重载、取地址运算符重载、const 修饰的类如何作为参数
开发语言·c++
一只小bit1 小时前
More Effective C++:改善编程与设计(上)
开发语言·c++·方法·技巧
钢铁男儿2 小时前
C# 方法(栈帧)
开发语言·c#