1.8 用Cargo进行包管理
Cargo可以为开发者安装依赖项。在crate.io上有越来越多的免费crate(Rust中对软件包的称呼),Cargo使得安装和使用这些crate,以及发布自己的crate,都变得很简单。
你可以通过输入cargo search [search term],或者访问crate网站来查找可用的crate。例如,以bracket-terminal为关键词进行搜索可以得到如下的结果:
搜索功能也会检索crate的描述信息。例如,你需要寻找一个“slot map”,就可以得到多个搜索结果:
在找到希望使用的crate以后,你需要将其添加到Cargo.toml中。在[dependencies]小节下添加一行并写上依赖的名字和版本号:
[dependencies] bracket-lib = "0.8.0"
这里的版本号采用了语义化版本号的规范,就像在当前项目中所使用的版本号一样。语义化版本号所表达的含义如下。
(1)第一位数字表示“主”版本。某个crate一旦发布,就要尽力保证不做破坏兼容性的修改,从而保证主版本号不用增长。0号版本是一个特例。主版本号为0的crate处于预发布(pre-release)状态——它们可以做出破坏兼容性的修改。
(2)第二位数字表示“次”版本。添加新功能但同时保证不破坏兼容性的改动通常会导致次要版本号的增长。
(3)第三位数字表示修订号。对于一个缺陷的快速修复通常会导致修订号的增长。
用户可以通过一些限定符来实现对所使用的crate的版本号进行细粒度控制。
(1)=0.8.0将只使用0.8.0这个版本,任何高或低的版本都不行。
(2)^0.8.0将使用任何版本号等于或大于0.8.0的版本,但只能在0.x这个范围内使用[6]。
[6] 只能在主版本号为0.x的情况下使用。——译者注
(3)~0.8.0将使用任何次要版本号大于0.8.0的版本。如果有新版本出现,则会自动升级,即使升级会破坏crate的API兼容性。
除版本号外,还有一些其他的选项可供配置。你可以指定一个版本的来源:它可以来自crate.io,可以来自一个git仓库的地址,甚至来自一个存放在当前计算机上的crate的本地路径。举个例子,假设你想使用GitHub版本的bracket-lib库,则可以按如下方式指定:
[dependencies] bracket-lib = { git = "▓▓▓▓▓▓//github ▓▓▓▓/thebracket/bracket-lib" }
crate还提供了特性开关(feature flag),这使得crate能够提供可选功能。例如,bracket-lib可以被配置成使用Amethyst作为其后端,而不是使用OpenGL。用如下方法来开启这样的特性:
[dependencies] bracket-lib = { git = "https://github.com/thebracket/bracket-lib", default-features = false, features = [ "amethyst_engine_vulkan" ] }
你可以通过从Cargo.toml文件中删除对应条目的方法来为项目删除一个依赖项。运行cargo clean,则会把这些依赖从这台计算机上彻底删除[7]。在3.1.2节中,你将用到Cargo的依赖项。
[7] 从Cargo.toml中删除依赖项时仅表示项目不再使用该依赖了,但并不会删除已经下载到本地计算机的依赖项。如果希望释放存储空间,则需要在Cargo.toml中删除依赖项之后,再执行cargo clean来彻底将其删除。——译者注