Cargo - 构建 rust项目、管理依赖包
Cargo - 构建 rust项目、管理依赖包
Cargo是Rust的包管理器,用于构建Rust项目和管理依赖包。本文将详细介绍Cargo的基本概念、项目构建流程、依赖管理以及常用命令等。
关于 Cargo
- Cargo 官方文档 :https://doc.rust-lang.org/cargo/
- crates :https://crates.io
Cargo 是 Rust 的包管理器。Cargo 下载 Rust 包的依赖项,编译包,创建可分发的包,并将它们上传到 crates.io,这是 Rust 社区的包注册表。
构建项目
创建工程
cargo new world_hello
目录结构如下
$ tree
.
├── Cargo.toml
└── src
└── main.rs
1 directory, 2 files
- Cargo.toml
为 Rust 的清单文件。其中包含了项目的元数据和依赖库。 - src/main.rs
为编写应用代码的地方。
编译运行
cargo run
Compiling world_hello v0.1.0 (/Users/user/Documents/code/scode1/rust/world_hello)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.95s
Running `target/debug/world_hello`
Hello, world!
会产生编译文件
$ tree -L 3
.
├── Cargo.lock
├── Cargo.toml
├── src
│ └── main.rs
└── target
├── CACHEDIR.TAG
└── debug
├── build
├── deps
├── examples
├── incremental
├── world_hello
└── world_hello.d
运行 build/run 命令会创建一个新文件 Cargo.lock,该文件记录了本地所用依赖库的精确版本。
build
使用 run 就会自动build,但有时候我们可以只使用 build
cargo build
- 会生成 debug 文件夹:world_hello/target/debug
- 将 debug 文件夹删掉,再次 build 会产生新的 debug 文件夹;
- 如果原文件没修改,build 后,debug 的内容可能不会更新。
clean
cargo clean
debug 等文件夹会被删掉
$ cargo clean
Removed 119 files, 11.4MiB total
$ tree
.
├── Cargo.lock
├── Cargo.toml
└── src
└── main.rs
1 directory, 3 files
管理依赖
创建项目会自动生成 Cargo.toml 文件
原始内容如下:
[package]
name = "world_hello"
version = "0.1.0"
edition = "2021"
[dependencies]
添加依赖
在 Rust 中,我们通常把包称作 crates
你可以在 crates 库搜索依赖:https://crates.io/crates/rand
这里以添加 rand 为例,添加在 [dependencies] 下方
...
[dependencies]
rand = "0.3.14"
再次 build
$ cargo build
Updating crates.io index
Downloaded rand v0.3.23
Downloaded rand v0.4.6
Downloaded libc v0.2.154
Downloaded 3 crates (831.0 KB) in 1.22s
Compiling libc v0.2.154
Compiling rand v0.4.6
Compiling rand v0.3.23
Compiling world_hello v0.1.0 (/Users/user/Documents/code/scode1/rust/world_hello)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.11s
查看文件结构
多出了 rand 相关内容
$ tree
.
├── Cargo.lock
├── Cargo.toml
├── src
│ └── main.rs
└── target
├── CACHEDIR.TAG
└── debug
├── build
│ ├── libc-f94129358965b880
│ │ ├── invoked.timestamp
│ │ ├── out
│ │ ├── output
│ │ ├── root-output
│ │ └── stderr
│ └── libc-fc8c71922db79826
│ ├── build-script-build
│ ├── build_script_build-fc8c71922db79826
│ └── build_script_build-fc8c71922db79826.d
├── deps
│ ├── libc-2cd8d736a65e3bdc.d
│ ├── libc-2cd8d736a65e3bdc.libc.844209738d3bf612-cgu.0.rcgu.o
│ ├── liblibc-2cd8d736a65e3bdc.rlib
│ ├── liblibc-2cd8d736a65e3bdc.rmeta
│ ├── librand-51e82a279537c372.rlib
│ ├── librand-51e82a279537c372.rmeta
│ ├── librand-76148f2644fb6b76.rlib
│ ├── librand-76148f2644fb6b76.rmeta
│ ├── rand-51e82a279537c372.d
│ ├── ...
│ ├── rand-76148f2644fb6b76.rand.46a886c6f1f6cb04-cgu.4.rcgu.o
│ ├── world_hello-7dfffed2f60728f0
│ ├── ...
│ └── world_hello-ffc760ff065d95f4.rvrclgiszz772pw.rcgu.o
├── examples
├── incremental
│ ├── world_hello-2gr5fivx8ev9t
│ │ ├── s-gvxy0ymbb9-azi538-5zea3fzl7hz9mcsbpmuo9lnu2
│ │ │ ├── 2ao7q67wh7pwb6v2.o
│ │ │ ├── ...
│ │ │ └── work-products.bin
│ │ └── s-gvxy0ymbb9-azi538.lock
│ └── world_hello-32qpckyi3s6et
│ ├── s-gvxxyb5ewl-1g1nr9k-5ewriqusvpjsrgth3731ddhf3
│ │ ├── 2jcl4b6uedw0auwo.o
│ │ ├── ...
│ │ ├── rvrclgiszz772pw.o
│ │ └── work-products.bin
│ └── s-gvxxyb5ewl-1g1nr9k.lock
├── world_hello
└── world_hello.d
14 directories, 65 files
update
更新所有依赖
cargo update
更新指定库
cargo update -p rand
check
查看对目录进行了哪些更改
修改内容 按 倒序排序
运行 check 之前,cargo clean 清理目录
$ cargo check
Checking libc v0.2.154
Checking rand v0.4.6
Checking rand v0.3.23
Checking world_hello v0.1.0 (/Users/user/Documents/code/scode1/rust/world_hello)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.94s
计时
查看编译时间
time cargo build
manual
cargo help
Rust’s package manager
Usage: cargo [+toolchain] [OPTIONS] [COMMAND]
cargo [+toolchain] [OPTIONS] -Zscript
Options:
-V, --version, Print version info and exit
-list, List installed commands
-explain <CODE, Provide a detailed explanation of a rustc error message
-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
-h, --help, Print help
Commands:
- 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
- uninstall Uninstall a Rust binary
… : See all commands with --list
See cargo helpfor more information on a specific command.
写完以上后,发现这个官方教程就挺好,参考:
https://www.rust-lang.org/zh-CN/learn