mirror of https://github.com/sunface/rust-course
parent
13d35c6cc3
commit
64246fdcc6
@ -1 +0,0 @@
|
|||||||
# 自定义构建脚本
|
|
@ -1,7 +0,0 @@
|
|||||||
# 构建缓存
|
|
||||||
|
|
||||||
|
|
||||||
## cargo 下载卡住
|
|
||||||
删除 ~/.cargo/.package-cache
|
|
||||||
|
|
||||||
https://zhuanlan.zhihu.com/p/74875840
|
|
@ -1 +0,0 @@
|
|||||||
# Cargo.toml和Cargo.lock
|
|
@ -1 +0,0 @@
|
|||||||
# 常用命令
|
|
@ -1,6 +0,0 @@
|
|||||||
# 依赖管理
|
|
||||||
|
|
||||||
|
|
||||||
## 依赖升级
|
|
||||||
|
|
||||||
Minor note about your second point: You can use cargo update to update versions of transitive dependencies in your Cargo.lock when applicable; the very nice cargo-edit crate provides a cargo upgrade command which does the same for your Cargo.toml. If you use VSCode, I can also recommend the "crates" extension which shows available updates inline in your Cargo.toml.
|
|
@ -1,23 +0,0 @@
|
|||||||
# 条件编译、条件依赖
|
|
||||||
|
|
||||||
|
|
||||||
## 通过featre来实现不同的derive
|
|
||||||
比如有一个类型,我们希望在不同包引用它的时候,派生引用不同的特征,可以这么做:
|
|
||||||
|
|
||||||
在`Cargo.toml`中定义新的`feature`:
|
|
||||||
```toml
|
|
||||||
[features]
|
|
||||||
sqlx = []
|
|
||||||
```
|
|
||||||
|
|
||||||
在类型定义处:
|
|
||||||
```rust
|
|
||||||
#[cfg_attr(feature = "sqlx", derive(sqlx::Type)]
|
|
||||||
#[derive(Debug, PartialEq, Deserialize, Serialize, strum_macros::EnumString)]
|
|
||||||
pub enum Role {Owner,Admin,User,}
|
|
||||||
```
|
|
||||||
|
|
||||||
在希望派生`sqlx`的包:
|
|
||||||
```toml
|
|
||||||
your_shared_crate = { version = "0.0.1", features = ["sqlx"] }
|
|
||||||
```
|
|
@ -0,0 +1,60 @@
|
|||||||
|
# 添加依赖
|
||||||
|
[`crates.io`](https://crates.io) 是 Rust 社区维护的中心化 `package` 注册服务,用户可以在其中寻找和下载所需的 `package`。对于 `cargo` 来说,默认就是从这里下载依赖。
|
||||||
|
|
||||||
|
下面我们来添加一个 `time` 依赖包,若你的 `Cargo.toml` 文件中没有 `[dependencies]` 部分,就手动添加一个,然后添加目标包名和版本号:
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
time = "0.1.12"
|
||||||
|
```
|
||||||
|
|
||||||
|
可以看到我们指定了 `time` 包的版本号 "0.1.12",关于版本号,实际上还有其它的指定方式,具体参见[指定依赖项](https://course.rs/cargo/reference/specify-deps/intro.html)章节。
|
||||||
|
|
||||||
|
如果想继续添加 `regexp` 包,只需在 `time` 包后面添加即可 :
|
||||||
|
```toml
|
||||||
|
[package]
|
||||||
|
name = "hello_world"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
time = "0.1.12"
|
||||||
|
regex = "0.1.41"
|
||||||
|
```
|
||||||
|
|
||||||
|
此时,再通过运行 `cargo build` 来重新构建,首先 `Cargo` 会获取新的依赖以及依赖的依赖, 接着对它们进行编译并更新 `Cargo.lock`:
|
||||||
|
```shell
|
||||||
|
$ cargo build
|
||||||
|
Updating crates.io index
|
||||||
|
Downloading memchr v0.1.5
|
||||||
|
Downloading libc v0.1.10
|
||||||
|
Downloading regex-syntax v0.2.1
|
||||||
|
Downloading memchr v0.1.5
|
||||||
|
Downloading aho-corasick v0.3.0
|
||||||
|
Downloading regex v0.1.41
|
||||||
|
Compiling memchr v0.1.5
|
||||||
|
Compiling libc v0.1.10
|
||||||
|
Compiling regex-syntax v0.2.1
|
||||||
|
Compiling memchr v0.1.5
|
||||||
|
Compiling aho-corasick v0.3.0
|
||||||
|
Compiling regex v0.1.41
|
||||||
|
Compiling hello_world v0.1.0 (file:///path/to/package/hello_world)
|
||||||
|
```
|
||||||
|
|
||||||
|
在 `Cargo.lock` 中包含了我们项目使用的所有依赖的准确版本信息。这个非常重要,未来就算 `regexp` 的作者升级了该包,我们依然会下载 `Cargo.lock` 中的版本,而不是最新的版本,只有这样,才能保证项目依赖包不会莫名其妙的因为更新升级导致无法编译。 当然,你还可以使用 `cargo update` 来手动更新包的版本。
|
||||||
|
|
||||||
|
此时,就可以在 `src/main.rs` 中使用新引入的 `regexp` 包:
|
||||||
|
```rust
|
||||||
|
use regex::Regex;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let re = Regex::new(r"^\d{4}-\d{2}-\d{2}$").unwrap();
|
||||||
|
println!("Did our date match? {}", re.is_match("2014-01-01"));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
运行后输出:
|
||||||
|
```shell
|
||||||
|
$ cargo run
|
||||||
|
Running `target/hello_world`
|
||||||
|
Did our date match? true
|
||||||
|
```
|
@ -0,0 +1,17 @@
|
|||||||
|
# 下载并构建Package
|
||||||
|
如果看中 `Github` 上的某个开源 Rust 项目,那下载并构建它将是非常简单的。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git clone https://github.com/rust-lang/regex.git
|
||||||
|
$ cd regex
|
||||||
|
```
|
||||||
|
|
||||||
|
如上所示,直接从 `github` 上克隆下来想要的项目,然后使用 `cargo build` 进行构建即可:
|
||||||
|
```shell
|
||||||
|
$ cargo build
|
||||||
|
Compiling regex v1.5.0 (file:///path/to/package/regex)
|
||||||
|
```
|
||||||
|
|
||||||
|
该命令将下载相关的依赖库,等下载成功后,再对 `package` 和下载的依赖进行一同的编译构建。
|
||||||
|
|
||||||
|
这就是包管理工具的强大之处,`cargo build` 搞定一切,而背后隐藏的复杂配置、参数你都无需关心。
|
@ -0,0 +1,2 @@
|
|||||||
|
# 使用手册
|
||||||
|
在本章中,我们将学习 `Cargo` 的详细使用方式,例如 `Package` 的创建与管理、依赖拉取、`Package` 结构描述等。
|
@ -0,0 +1,47 @@
|
|||||||
|
# 标准的Package目录结构
|
||||||
|
一个典型的 `Package` 目录结构如下:
|
||||||
|
```shell
|
||||||
|
.
|
||||||
|
├── Cargo.lock
|
||||||
|
├── Cargo.toml
|
||||||
|
├── src/
|
||||||
|
│ ├── lib.rs
|
||||||
|
│ ├── main.rs
|
||||||
|
│ └── bin/
|
||||||
|
│ ├── named-executable.rs
|
||||||
|
│ ├── another-executable.rs
|
||||||
|
│ └── multi-file-executable/
|
||||||
|
│ ├── main.rs
|
||||||
|
│ └── some_module.rs
|
||||||
|
├── benches/
|
||||||
|
│ ├── large-input.rs
|
||||||
|
│ └── multi-file-bench/
|
||||||
|
│ ├── main.rs
|
||||||
|
│ └── bench_module.rs
|
||||||
|
├── examples/
|
||||||
|
│ ├── simple.rs
|
||||||
|
│ └── multi-file-example/
|
||||||
|
│ ├── main.rs
|
||||||
|
│ └── ex_module.rs
|
||||||
|
└── tests/
|
||||||
|
├── some-integration-tests.rs
|
||||||
|
└── multi-file-test/
|
||||||
|
├── main.rs
|
||||||
|
└── test_module.rs
|
||||||
|
```
|
||||||
|
|
||||||
|
这也是 `Cargo` 推荐的目录结构,解释如下:
|
||||||
|
|
||||||
|
- `Cargo.toml` 和 `Cargo.lock` 保存在 `package` 根目录下
|
||||||
|
- 源代码放在 `src` 目录下
|
||||||
|
- 默认的 `lib` 包根是 `src/lib.rs`
|
||||||
|
- 默认的二进制包根是 `src/main.rs`
|
||||||
|
- 其它二进制包根放在 `src/bin/` 目录下
|
||||||
|
- 基准测试 benchmark 放在 `benches` 目录下
|
||||||
|
- 示例代码放在 `examples` 目录下
|
||||||
|
- 集成测试代码放在 `tests` 目录下
|
||||||
|
|
||||||
|
|
||||||
|
关于 Rust 中的包和模块,[之前的章节](https://course.rs/basic/crate-module/intro.html)有更详细的解释。
|
||||||
|
|
||||||
|
这里的一些目录配置还能通过配置文件来修改,详情参见本章的后续章节[修改默认的文件目录](https://course.rs/cargo/reference/manifest/cargo-target.html)
|
@ -1,2 +1,8 @@
|
|||||||
# cargo
|
# Cargo 使用指南
|
||||||
|
Rust 语言的名气之所以这么大,保守估计 `Cargo` 的贡献就占了三分之一。
|
||||||
|
|
||||||
|
`Cargo` 是包管理工具,可以用于依赖包的下载、编译、更新、分发等,与 `Cargo` 一样有名的还有 [`crates.io`](https://crates.io),它是社区提供的包注册中心:用户可以将自己的包发布到该注册中心,然后其它用户通过注册中心引入该包。
|
||||||
|
|
||||||
|
> 本章内容是基于 [Cargo Book](https://doc.rust-lang.org/stable/cargo/index.html) 翻译,并做了一些内容优化和目录组织上的调整
|
||||||
|
|
||||||
|
<img src="https://doc.rust-lang.org/stable/cargo/images/Cargo-Logo-Small.png" />
|
@ -1 +0,0 @@
|
|||||||
# manifest
|
|
@ -1,4 +0,0 @@
|
|||||||
# Cargo profile
|
|
||||||
|
|
||||||
|
|
||||||
## custom profiles (rust 1.57.0)
|
|
@ -0,0 +1 @@
|
|||||||
|
# 进阶参考
|
@ -0,0 +1 @@
|
|||||||
|
# 修改默认的文件目录
|
@ -0,0 +1 @@
|
|||||||
|
# Cargo.toml格式讲解
|
@ -0,0 +1 @@
|
|||||||
|
# 指定依赖项
|
@ -0,0 +1 @@
|
|||||||
|
# 依赖覆盖
|
@ -1 +0,0 @@
|
|||||||
# 工作空间
|
|
Loading…
Reference in new issue