Cargo is a built-in build system and package manager in the rust tool chain. It can deal with many trivial but important tasks, such as building code, downloading and compiling dependency library, etc. Most rust users will choose it to manage their own rust projects.
Managing rust projects and their module dependencies
Check cargo version
$ cargo --version
Create a project
$ cargo new hello_cargo
After executing the above command, cargo will create a project directory with the same name and place the files it generates. get intohello_cargoFolder, you can see two files and a directory just generated by cargo: one namedCargo.tomlAnd a file namedmain.rsThe source code file is placed in the SRC directory. At the same time, cargo also initializes a new git repository and generates the default git repository.gitignorefile
cargo.tlml Is the generated standard configuration file, the content is as follows:
[package] name = "hello_cargo" version = "0.1.0" authors = ["Your Name <[email protected]"] edition = "2018" [dependencies]
In the last line of text
[dependencies]Is a region label that indicates that subsequent regions will be used to declare project dependencies.
Cargo will save all source code files to SRC directory by default, while the project root directory is only used to store files unrelated to source code, such as readme documents, license statements, configuration files, etc.
Build and run projects
In the current
hello_cargoUnder the project directory, compile:
$ cargo build Compiling hello_cargo v0.1.0 (/Users/Herbert/rust/projects/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 0.21s
The executable is generated in the pathtarget/debug/hello_cargo。
First use command
cargo buildWhen it builds, it also creates a file namedCargo.lockThis file records the specific version numbers of all the dependent libraries of the current project.
It can also be used simply
cargo runCommand to complete the compilation and running tasks in turn
$ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.00s Running `target/debug/hello_cargo` Hello, world!
If the source code is not modified, the generated binary executable will be run directly.
cargo checkTo quickly check whether the current code can be compiled without spending extra time to actually generate an executable program
$ cargo check Checking hello_cargo v0.1.0 (/Users/Herbert/rust/projects/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 0.06s
cargo checkSkipping the step of building an executable. In the process of coding, you need to check errors through the compiler, so use
cargo checkWill greatly speed up the process of compiling.
Build with release mode
When you are ready to publish your project, you can use the command
cargo build --releaseBuild and generate executable program in optimization mode
$ cargo build --release Compiling hello_cargo v0.1.0 (/Users/Herbert/rust/projects/hello_cargo) Finished release [optimized] target(s) in 0.15s
The generated executable is placed in the
target/releaseUnder the directory.
This mode will optimize the code at the cost of longer compilation time, so that the code has better runtime performance.
Dependency package management
If you build a program that relies on a third-party library, you need to modify itCargo.tomlAdd a dependency. For example, the program introduces the RAND package, which is generated in cargo
[dependencies]Add dependency below area:
[dependencies] rand = "0.3.14"
[dependencies]The region is used to declare all the dependent packages and their version numbers needed in the project. We specify the RAND package version number as 0.3.14, where the number 0.3.14 is actually a shorthand for ^ 0.3.14, which means “any version compatible with 0.3.14 public API”.
With the dependency, cargo gets the latest version information of all available libraries from the registry, which is usually obtained from thecrates.ioIt’s a copy from the library. It will start item by item checking after updating the registry
[dependencies]And download the currently missing dependency package.
Cargo.lock File lock
When building a project for the first time, cargo will traverse the declared dependencies and their corresponding semantic versions in turn, find the specific version numbers that meet the requirements, and write them into theCargo.lockDocuments.
When you build the project again, cargo will retrieve it firstCargo.lockIf there is a dependency library with a specific version specified in the file, it will skip the process of calculating the version number and directly use the version specified in the file.
Upgrade dependency package
Cargo provides a special command: update, which forces cargo to ignoreCargo.lockFile, and recalculate all the dependent packagesCargo.tomlThe latest version of the declaration. If it runs successfully, cargo will write the updated version number toCargo.lockFile and overlay the previous content.
$ cargo update Updating registry `https://github.com/rust-lang/crates.io-index` Updating rand v0.3.14 -> v0.3.15