#cargo #fetch #packages #aims #stable #api #git

cargo_fetch

一个旨在为工具提供易于使用且稳定的 API 来抓取包的库

3 个版本

0.1.2 2023 年 2 月 25 日
0.1.1 2023 年 2 月 19 日
0.1.0 2023 年 2 月 9 日

#33 in #aims

Download history

每月 55 次下载

MIT/Apache

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