3 个版本
0.1.2 | 2023 年 2 月 25 日 |
---|---|
0.1.1 | 2023 年 2 月 19 日 |
0.1.0 | 2023 年 2 月 9 日 |
#33 in #aims
每月 55 次下载
20KB
233 行
cargo_fetch
是什么?
一个旨在为工具提供易于使用且稳定的 API 来抓取包的库。底层使用 cargo
库。
为什么?
使用 cargo
库可以重用大量代码,这些代码如果不重写将是困难和繁琐的。这包括
- 使用
cargo
缓存($HOME/.cargo
), - 支持
cargo
所有的包来源:远程、本地仓库、git 仓库、本地路径。
重用 cargo
代码还提供了可靠性和安全性。
如何?
使用这个库很简单
use cargo_fetch::{GitReference, Package, PackageFetcher, PackageSource};
fn main() {
let mut fetcher = PackageFetcher::new().expect("failed to construct the fetcher");
let custom_source = PackageSource::remote("https://github.com/rust-lang/crates.io-index").expect("bad url");
let git_source = PackageSource::git(
"https://github.com/serde-rs/serde",
Some(GitReference::Tag("v1.0.0".into())),
)
.expect("bad url");
// Same as `serde = "*"` in Cargo.toml
let crates_io = fetcher.resolve_first("serde", None, PackageSource::CratesIo, None).expect("can't find serde");
let custom_registry = Package::from_str_ver("serde", "1.0.0", &custom_source).expect("bad semver");
let git = Package::from_str_ver(
"serde", // name
"1.0.0", // version
&git_source, // source
)
.expect("bad semver");
let serde_roots = fetcher
.fetch_many(&[git, crates_io, custom_registry])
.expect("failed to fetch packages");
println!("serde_roots={serde_roots:#?}");
}
您可以在本仓库的根目录中运行此示例:使用 cargo run --example fetch_serde
。
许可证
根据 Apache License 2.0 <LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0> 或 MIT 许可证 <LICENSE-MIT 或 https://opensource.org/licenses/MIT> 许可,由您选择。项目中的文件除非根据这些条款复制、修改或分发,否则不得复制、修改或分发。
依赖关系
~51MB
~1M SLoC