Rust开发工具之cargo、cargo-generate、cargo-binstall
更新日期:
Cargo是Rust的包管理工具, 通过rustup
脚本来安装rust工具链时会自动安装cargo
命令, 可用来创建Rust项目、安装与管理依赖、构建项目与发布包。
cargo工具的基本使用
创建项目
cargo new helloworld
新建一个生成可执行文件的项目,等同于cargo new helloworld --bin
, 项目文件夹helloworld
下将生成文件Cargo.toml
和src/main.rs
两个文件。Cargo.toml
是manifest文件, 项目配置的元数据,保存项目信息与依赖的cratecargo new mylib --lib
新建生成lib库的项目,在项目文件夹mylib
下 创建Cargo.toml
和src/lib.rs
依赖管理
crates.io是rust社区的包注册仓库,在项目中需要将依赖包的版本添加在Cargo.toml
文件中。 这里在前面生成的helloworld项目中添加一依赖ferris-says
,打印使用ascii码生成的图形。
cargo add ferris-says
使用命令添加是一种方式;移除依赖使用命令cargo remove ferris-says
- 也可以手动编辑
Cargo.toml
文件,将依赖库添加在[dependencies]
段下
|
|
Cargo.toml
文件的内容如下:
cargo tree
命令可显示依赖关系图
编辑src/main.rs
文件,引用ferris-says
中的方法
|
|
构建项目与执行
接下来执行构建命令,生成可执行文件;依赖的包将从crates.io下载到本地, 缓存目录是 $HOME/.cargo/registry
。
|
|
cargo run
命令用于运行构建出的程序
参考:
- The Cargo Book https://doc.rust-lang.org/cargo/index.html
- crates.io包注册仓库 https://crates.io/
cargo-generate
cargo-generate
是一个创建rust项目的工具,以git仓库为模板生成新项目的文件。需要先安装后使用。
|
|
- cargo-generate 命令的基本格式为
cargo generate username-on-github/mytemplate
, 默认是从github上的仓库作为模板;也可以在仓库名前添加前缀gh:
指明git平台cargo generate gh:username-on-github/mytemplate
; 支持的前缀有gh:
github.com,gl:
gitlab.com,bb:
bitbucket.org,sr:
git.sr.ht。 - 或者使用参数
--git
直接指定git仓库的全路径,如cargo generate --git https://github.com/username-on-github/mytemplate.git
- 使用本地仓库作为模板时使用
--path
参数,cargo generate --path /path/to/template
|
|
参考:
- Cargo Generate Documentation https://cargo-generate.github.io/cargo-generate/index.html
- cargo-generate github https://github.com/cargo-generate/cargo-generate
cargo-binstall
cargo-binstall
可以直接从二进制文件来安装Rust程序, 用于简化cargo install
直接从源码编译的安装方式。Binstall首先会从crates.io获取包的基本信息,然后从关联的repository仓库查找发布的版本包,未找到时会查找三方托管库quickinstall,仍然未找到时就退回cargo install
从源码安装。
|
|
参考:
- cargo-binstall github https://github.com/cargo-bins/cargo-binstall
cargo中的子命令
前面的例子可以发现,安装的应用是cargo-generate
, 在使用是cargo generate
而不是直接使用命令cargo-generate
,为什么呢? 这里就涉及cargo子命令的调用方式。
Cargo被设计成可以扩展新的子命令,不用修改cargo程序本身。当以cargo (?<command>[^ ]+)
形式调用时,会转变成对外部程序cargo-${command}
的调用, 当然该外部程序需要在$PATH
路径上。 调用子命令时,传给外部程序的第一个参数是程序文件名,第二个参数是子命令名${command}
, 命令行中其它参数会原样作为附加参数传给子命令。
执行cargo generate
实际上也是转成调用cargo-generate
, 第二个参数是generate
。
cargo也可以打印子命令的帮助信息, cargo help ${command}
会转成调用cargo-${command} ${command} --help
参考: