有没有办法通过命令获取Rust crate的可安装版本列表?

问题描述 投票:0回答:1

我想在脚本中获取 Rust 板条箱的可安装版本列表。

我想要的不是已安装的版本,而是可安装的版本。

您可以在 https://crates.io 上查看可安装版本的列表。

例如https://crates.io/crates/skim/versions

我想在脚本中获取列表。

我检查了cargo的子命令和命令行选项,但没有找到我想要的命令和选项。

rust rust-cargo
1个回答
4
投票

我在

cargo
文档中也找不到任何类似的命令。但似乎有一个 API 端点(
/api/v1/crates/<crate_name>/versions
)可用于获取
crate
的所有可安装版本。 由于您正在寻找
cargo
命令,因此您可以使用自己的自定义命令扩展 cargo。

使用自定义命令扩展货物

Cargo 的设计让您可以 使用新的子命令扩展它,而无需修改 Cargo。如果一个

$PATH
中的二进制文件名为
cargo-something
,您可以像运行它一样运行它 是运行
cargo something
的 Cargo 子命令。自定义命令 当您运行
cargo --list
时也会列出这样的内容。能够使用
cargo install
安装扩展,然后像下面一样运行它们 内置 Cargo 工具是 Cargo 设计的一个超级方便的好处。

为此,首先创建一个新项目:

$ cargo new cargo-list-installable-versions --bin

请注意,项目名称的格式应为

cargo-YOUR_SUB_COMMAND_NAME
。现在将这两个依赖项添加到
Cargo.toml
文件中。

reqwest = { version = "0.11.18", features = ["blocking", "json"] }
serde_json = "1.0.96"

现在在

main.rs
中,您可以实现从 API 端点获取版本的逻辑
/api/v1/crates/<crate_name>/versions

这是非常基本的实现。

use std::env;

fn main() {
    if let Some(package_name) = env::args().nth(2) {
        let client = reqwest::blocking::Client::builder()
            .user_agent("YOUR_USER_AGENT")
            .build()
            .unwrap();
        let api_url = format!(
            "https://crates.io/api/v1/crates/{}/versions",
            package_name.trim()
        );
        let resp = client
            .get(api_url)
            .send()
            .unwrap()
            .json::<serde_json::Value>()
            .unwrap();
        if let Some(installable_versions) = resp["versions"].as_array() {
            for version in installable_versions {
                println!("{}", version["num"])
            }
        }
    } else {
        eprintln!("package name is missing")
    }
}

现在构建并发布项目。确保将发布文件夹添加到

$PATH
环境变量中。

$ cargo build --release
$ export PATH="PATH_TO_YOUR_RELEASE_FOLDER:$PATH"

现在您已准备好使用您的子命令。如果您正确配置了所有内容,您可以在

list-installable-versions
下看到
cargo --list
子命令。因此,要实际运行子命令,您可以使用

$ cargo list-installable-versions <crate_name>

这将打印

<crate_name>
的所有可安装版本。

© www.soinside.com 2019 - 2024. All rights reserved.