我想得到一个铁 rust crate 的脚本可安装版本的列表.

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

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

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

我想把名单写成 playbook .

我判断了Cargo的子命令和命令行选项,但找不到任何我想要的命令和选项.

推荐答案

我在cargo文档中也找不到任何类似的命令.但是似乎有一个API端点(/api/v1/crates/<crate_name>/versions)可用来获取Acrate的所有可安装版本.

由于您正在寻找cargo命令,因此您可以扩展cargo with your own custom command.

100

Cargo 的设计使您可以 使用新的子命令对其进行扩展,而不必修改Cargo .如果一个 你的$PATH中的二进制被命名为cargo-something,你可以像运行它一样运行它 是一个货运子司令部,运行cargo something号.自定义命令 当你跑cargo --list的时候,也会出现这样的情况.能够使用 cargo install安装扩展,然后运行它们,就像 内置的货运工具是货运设计的一个超级方便的好处!

要做到这一点,首先创建一个新项目.

$ 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端点获取版本的逻辑.以下是非常基本的实现.

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")
    }
}

现在构建和发布该项目.确保将Release文件夹添加到$PATH环境变量中.

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

现在您已经准备好使用子命令了.如果您正确配置了所有内容,您可以在cargo --list下看到list-installable-versions子命令.因此,要实际运行子命令,您可以使用

$ cargo list-installable-versions <crate_name>

这将打印<crate_name>的所有可安装版本.

Rust相关问答推荐

我怎样才能从一个Rust 的日期中go 掉3年?

MPSC频道在接收器处阻塞

取得本地对象字段的所有权

找不到 .has_func 或 .get_func 的 def

Cargo.toml:如何有条件地启用依赖项功能?

Rust 中的静态引用

tokio::sync::broadcast::Receiver 不是克隆

需要一个有序向量来进行 struct 初始化

为什么这个闭包没有实现Fn?

将原始可变指针传递给 C FFI 后出现意外值

SDL2 没有在终端键上触发?

没有分号的返回表达式的性能是否比使用返回更好?在Rust ?

预期的整数,找到 `&{integer}`

当我在 struct 中存储异步函数时,为什么它需要生命周期

用逗号分隔字符串,但在标记中使用逗号

从 Cranelift 发出 ASM

使用 `.` 将 T 转换为 &mut T?

有没有办法阻止 rust-analyzer 使非活动代码变暗?

在传输不可复制的值时实现就地枚举修改

令人困惑的错误消息? (解包运算符)