我想得到一个铁 rust crate 的脚本可安装版本的列表.
我想要的不是安装的版本,而是可安装的版本.
您可以在https://crates.io上看到可安装版本的列表.
例如https://crates.io/crates/skim/versions
我想把名单写成 playbook .
我判断了Cargo的子命令和命令行选项,但找不到任何我想要的命令和选项.
我想得到一个铁 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>
的所有可安装版本.