是否有Cargo命令可单独下载crates至registry目录及查询相关问题
问题1:有没有专门的Cargo命令仅将crate下载到本地registry目录?
没有专门的单一命令直接实现类似pip install package_name的效果,但可以通过两种简单方式达到目的:
方法1:使用
cargo fetch- 新建临时空Rust项目:
cargo new temp_project && cd temp_project - 在
Cargo.toml中添加目标crate依赖(比如serde = "1.0") - 执行
cargo fetch——这个命令仅会把该crate及其所有依赖下载到~/.cargo/registry目录,不会执行编译操作 - 完成后直接删除临时项目即可,已下载的依赖会保留在registry中
- 新建临时空Rust项目:
方法2:临时使用
cargo vendor
同样先新建临时项目并添加依赖,执行cargo vendor temp_vendor,Cargo会先将依赖下载到本地registry,再复制到指定的temp_vendor目录。之后删除临时项目和temp_vendor目录,registry里的依赖会留下。
你提到的cargo install确实仅适用于包含可执行目标([[bin]])的crate,纯库crate无法用这个命令处理。
问题2:如何查询某个crate是否已存在于本地registry目录?
有几种实用的方法:
方法1:直接查看文件系统
本地registry的缓存文件存放在~/.cargo/registry/cache/github.com-1ecc6299db9ec823/目录下,每个crate的对应版本会以{crate-name}-{version}.crate的压缩包形式存在,直接查看该目录即可确认。方法2:使用
cargo metadata命令
在任意Rust项目中(比如之前的临时项目),替换{crate-name}为目标名称后执行:cargo metadata --format-version 1 | jq '.packages[] | select(.name == "{crate-name}")'如果输出该crate的详细信息,说明它已在本地registry中;无输出则表示未下载。
方法3:离线模式测试
在添加了目标crate依赖的项目中执行cargo check --offline。如果命令成功运行,说明本地registry已有该依赖;若报错提示无法找到依赖,则表示未下载。
内容的提问来源于stack exchange,提问作者Keyboard Penman

