0、一些背景

package

程序如果依赖于外部库,需要手动传递它们的依赖关系,当更新依赖的外部库时相关依赖项也可能需要更新
有必要引入更高层的”package”抽象,并使用一个”package manager”来摆脱繁琐工作

  • 一个package对应一个项目
  • package定义在Cargo.toml
  • 一个package的内容限制
    • 0-n个可执行crate
    • 0到1个library
  • package生成限制

    • 只生成一个可执行文件
      • 只要有src/main.rs
    • 只生成一个库文件
      • 只要有src/lib.rs
    • 想要一个package中有多个可执行文件和一个库文件
      • src/bin下放多个含有main的rust文件
      • src/lib.rs文件对应于库文件

        Crate

  • 一个库或者可执行文件叫做crate

  • 是package编译后的输出文件
  • 可能有两种输出文件

    • 可执行文件 .exe
    • 库文件 .rlib

      module

  • 一个rust文件对应一个module

  • module里可以内嵌多个module

workspace

  • 一个workspace是一个目录
  • 包含一个Cargo.toml,不同于packages下的Cargo.toml
  • 一个Cargo.lock让所有packages共享,统一依赖
  • 所有packages的输出放到workspace的target目录

1、Cargo作用

Cargo是”package manager”,允许Rust项目声明其依赖项,并确保始终获得可重复的构建
Cargo做的四件事

  • 引入两个包含项目各种信息的元数据文件,其中包含不同的包信息
  • 获取并构建包的依赖项
  • 使用正确的参数来调用rustc或其他构建工具来构建包
  • 引入约定来让Rust包管理更轻松

使用现成的Cargo项目非常方便

  • git clone & cd
  • cargo build 直接获取所有依赖项并一起构建

    Cargo.toml

    是一个manifest元清单,它包含了Cargo编译项目需要的元数据
    Cargo.toml 从广义上描述你的依赖,并由你自己编写
    每个清单文件包含多个部分

  • [package]

  • [version]
  • 不一一举例,用到时再看

更换cargo源

  • 创建 $HOME/.cargo/config 文件,写入下面内容 ```rust [source.crates-io] registry = “https://github.com/rust-lang/crates.io-index

    指定镜像

    replace-with = ‘镜像源名’ # 如:tuna、sjtu、ustc,或者 rustcc

注:以下源配置一个即可,无需全部

中国科学技术大学

[source.ustc] registry = “https://mirrors.ustc.edu.cn/crates.io-index

>>> 或者 <<<

registry = “git://mirrors.ustc.edu.cn/crates.io-index”

上海交通大学

[source.sjtu] registry = “https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index/

清华大学

[source.tuna] registry = “https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git

rustcc社区

[source.rustcc] registry = “https://code.aliyun.com/rustcc/crates.io-index.git

  1. <a name="AuBCh"></a>
  2. ## Cargo.lock
  3. 包含依赖项的相关信息<br />**Cargo.lock 包含有关依赖项的确切信息,由Cargo自动维护,不应该手动编辑**<br />是否在.gitignore中放Cargo.lock?
  4. - 如果我是在构建其他项目要依赖的库,应该放在.gitignore
  5. - 如果我是在构建可执行文件,那么不该放在.gitignore,即git可以去管理它
  6. <a name="ZmFIT"></a>
  7. ## crates.io
  8. 是Rust社区的中央存储库,cargo默认使用它来查找需要的包<br />cargo查到需要的包后,会获取托管在crates.io的依赖,并添加到Cargo.toml<br />重新运行cargo build后,Cargo会获取新的依赖项及其所有依赖项,全部编译后,更新Cargo.lock<br />使用的时候需要指定extern crate,如下
  9. ```rust
  10. extern crate regex;
  11. use regex::Regex;
  12. fn main() {
  13. let re = Regex::new(r"^\d{4}-\d{2}-\d{2}$").unwrap();
  14. println!("Did our date match? {}", re.is_match("2014-01-01"));
  15. }

2、Cargo文件惯例

  • Cargo.toml和Cargo.lock存储在项目的根目录中.
  • 源代码进入src目录.
  • 默认库文件是src/lib.rs.
  • 默认的可执行文件是src/main.rs.
  • 其他可执行文件,可以放入src/bin/*.rs.
  • 集成测试进入tests目录(单元测试进到,正在测试的每个文件中).
  • 示例进入examples目录.
  • 基准进入benches目录.

    3、Cargo测试

    Cargo在两个地方找测试
  1. src中的每个文件,单元测试
  2. tests/中的任何测试,整合式测试

Cargo测试的内容(待续)

4、指定依赖项

我们可以为不同平台、不同开发期间使用不同依赖项
来自crates.io

  • 只需要名称和版本字符串
  • Caret条件:允许兼容更新指定版本
  • Tilde条件:指定更新最小版本
  • inequality条件:手动指定依赖的版本范围或者确切版本

来自git

  • 需要指定的最小信息是存储库的git位置,未指定其他信息时使用master分支来构建

覆盖本地依赖项
平台决定依赖

  • [target.’cfg(windows)’ .dependencies]

开发依赖项

  • [dev-dependencies]

构建依赖项

  • [build-dependencies]