我想在脚本中获取 Rust 板条箱的可安装版本列表。
我想要的不是已安装的版本,而是可安装的版本。
您可以在 https://crates.io 上查看可安装版本的列表。
例如https://crates.io/crates/skim/versions
我想在脚本中获取列表。
我检查了cargo的子命令和命令行选项,但没有找到我想要的命令和选项。
我在
cargo
文档中也找不到任何类似的命令。但似乎有一个 API 端点(/api/v1/crates/<crate_name>/versions
)可用于获取 crate
的所有可安装版本。
由于您正在寻找 cargo
命令,因此您可以使用自己的自定义命令扩展 cargo。
使用自定义命令扩展货物
Cargo 的设计让您可以 使用新的子命令扩展它,而无需修改 Cargo。如果一个
中的二进制文件名为$PATH
,您可以像运行它一样运行它 是运行cargo-something
的 Cargo 子命令。自定义命令 当您运行cargo something
时也会列出这样的内容。能够使用cargo --list
安装扩展,然后像下面一样运行它们 内置 Cargo 工具是 Cargo 设计的一个超级方便的好处。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 端点获取版本的逻辑 /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>
的所有可安装版本。