Rust之cargo简单熟悉

还记得上一篇文章 –《Rust简单开发环境搭建》中,helloworld的例子是用cargo来管理的,今天我们就来聊聊这个cargo

cargo是什么?为什么需要这个cargo

cargo是Rust的包管理器,Rust的包分为2种,一种是二进制可执行的包,一种是库的包,默认情况下就是第一种binary包

在Rust里,一个库或者可执行程序叫做一个crate,一般简单情况下,我们可以直接使用Rust的编译器rustc来编译这个crate,但如果编译这个crate需要许多编译参数,包含许多依赖,或者需要其他构建工具,手动去操作就会很麻烦,而且也很难管理,这样包管理器cargo就应运而生了

cargo主要做以下4个工作:

  • 引入两个包含包信息的元数据文件
  • 获取并构建包的依赖项
  • 用正确的参数调用rustc或其他构建工具来生成包
  • 引入规则约定,使使用Rust包变得更容易

包结构

下面是用cargo生成的包目录结构:

.
├── 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.tomlCargo.lock 放在包的根目录下面.
  • 源代码放在 src 目录.
  • 默认的库文件是 src/lib.rs.
  • 默认的可执行文件是 src/main.rs.
    • 其他可执行的放在 src/bin/.
  • Benchmarks放在 benches 目录.
  • 例子放在 examples 目录.
  • 集成测试放在 tests 目录.
    如果这些包含多个源码,额外模块,需在这些目录下面的子目录放上一个 main.rs.

Cargo.tomlCargo.lock说明:

  • Cargo.toml 文件主要是描述所有的依赖项,需要我们自己根据需求来修改
  • Cargo.lock 文件包含有关依赖项的确切信息. 该文件是由 Cargo 来维护,不能手动去修改.

Cargo.toml

这里说说这个我们平时需要修改的Cargo.toml:

[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
# 简单例子
依赖的包名 = "版本"

这个被叫做一个manifest, 它包含了Cargo编译这个包所需的所有元数据,manifest相关的格式及元素组成说明可详见 https://doc.rust-lang.org/cargo/reference/manifest.html

这里目前用的最多就是依赖项[dependencies],
填写好依赖项后,使用cargo build构建时, Cargo 会下载所有的依赖包并编译它们, 然后更新 Cargo.lock文件

使用cargo

cargo的简单用法在环境搭建时已经走过一遍了,这里不再赘述,后面遇到问题再一一研究
一些常见的命令如下,具体用法可通过help查看

$ cargo --help                          
Rust's package manager

Usage: cargo [+toolchain] [OPTIONS] [COMMAND]

Options:
  -V, --version             Print version info and exit
      --list                List installed commands
      --explain <CODE>      Run `rustc --explain CODE`
  -v, --verbose...          Use verbose output (-vv very verbose/build.rs output)
  -q, --quiet               Do not print cargo log messages
      --color <WHEN>        Coloring: auto, always, never
  -C <DIRECTORY>            Change to DIRECTORY before doing anything (nightly-only)
      --frozen              Require Cargo.lock and cache are up to date
      --locked              Require Cargo.lock is up to date
      --offline             Run without accessing the network
      --config <KEY=VALUE>  Override a configuration value
  -Z <FLAG>                 Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details
  -h, --help                Print help

Some common cargo commands are (see all commands with --list):
    build, b    Compile the current package
    check, c    Analyze the current package and report errors, but don't build object files
    clean       Remove the target directory
    doc, d      Build this package's and its dependencies' documentation
    new         Create a new cargo package
    init        Create a new cargo package in an existing directory
    add         Add dependencies to a manifest file
    remove      Remove dependencies from a manifest file
    run, r      Run a binary or example of the local package
    test, t     Run the tests
    bench       Run the benchmarks
    update      Update dependencies listed in Cargo.lock
    search      Search registry for crates
    publish     Package and upload this package to the registry
    install     Install a Rust binary. Default location is $HOME/.cargo/bin
    uninstall   Uninstall a Rust binary

See 'cargo help <command>' for more information on a specific command.

参考

cargo简单介绍就到此结束了,更多详细细节可查看其官方文档:
cargo官方文档