8 个版本 (2 个稳定版)
1.1.0 | 2023 年 6 月 27 日 |
---|---|
1.0.0 | 2023 年 5 月 8 日 |
0.6.0 | 2022 年 12 月 8 日 |
0.5.0 | 2022 年 3 月 24 日 |
0.1.0 | 2021 年 12 月 30 日 |
#28 在 命令行界面
每月 27,778 次下载
用于 34 个工具包 (31 个直接使用)
53KB
1K SLoC
Update-informer
为用 Rust 编写的 CLI 应用程序更新信息 🦀
它会在 Crates.io、GitHub、Npm 和 PyPI 上检查新版本 🚀
优势
- 支持 Crates.io、GitHub、Npm 和 PyPI。
- 可配置的 检查频率 和 请求超时。
- 缓存 检查更新结果。
- 可以实现自己的 注册表 或 HTTP 客户端。
- 最小依赖 - 只需 directories、semver、serde 和 HTTP 客户端 (ureq 或 reqwest)。
想法
这个想法其实并不新颖。这个功能早已存在于 GitHub CLI 应用程序 和 npm。
还有一个流行的 JavaScript 库。
用法
将 update-informer
添加到 Cargo.toml
[dependencies]
update-informer = "1.1"
默认情况下,update-informer
只能检查 Crates.io,并使用 ureq 作为默认的 HTTP 客户端。要启用对其他注册表或更改 HTTP 客户端的支持,请使用 features
[dependencies]
update-informer = { version = "1.1", default-features = false, features = ["github", "reqwest", "native-tls"] }
可用功能
名称 | 类型 | 默认? |
---|---|---|
crates | 注册表 | 是 |
github | 注册表 | 否 |
npm | 注册表 | 否 |
pypi | 注册表 | 否 |
ureq | HTTP 客户端 | 是 |
reqwest | HTTP 客户端 | 否 |
rustls-tls | HTTP 客户端功能 | 是 |
native-tls | HTTP 客户端功能 | 否 |
检查新版本
要检查新版本,请使用 UpdateInformer::check_version
函数。
此函数需要项目名称、当前版本以及注册表
use update_informer::{registry, Check};
let name = env!("CARGO_PKG_NAME");
let version = env!("CARGO_PKG_VERSION");
let informer = update_informer::new(registry::Crates, name, version);
if let Some(version) = informer.check_version().ok().flatten() {
println!("New version is available: {}", version);
}
更多示例您可以在这里找到。
间隔
请注意,第一次检查将在间隔过期后开始。默认间隔为24小时,但您可以更改它
use std::time::Duration;
use update_informer::{registry, Check};
const EVERY_HOUR: Duration = Duration::from_secs(60 * 60);
let informer = update_informer::new(registry::Crates, "crate_name", "0.1.0").interval(EVERY_HOUR);
informer.check_version(); // The check will start only after an hour
缓存
默认情况下,update-informer
会在缓存目录中创建一个文件,以避免向注册表API发送垃圾请求。
为了不缓存请求,请使用零间隔
use std::time::Duration;
use update_informer::{registry, Check};
let informer = update_informer::new(registry::Crates, "crate_name", "0.1.0").interval(Duration::ZERO);
informer.check_version();
请求超时
您还可以更改请求超时时间。默认情况下,它是5秒
use std::time::Duration;
use update_informer::{registry, Check};
const THIRTY_SECONDS: Duration = Duration::from_secs(30);
let informer = update_informer::new(registry::Crates, "crate_name", "0.1.0").timeout(THIRTY_SECONDS);
informer.check_version();
实现自己的注册表
您可以实现自己的注册表来检查更新。例如
use update_informer::{http_client::{GenericHttpClient, HttpClient}, registry, Check, Package, Registry, Result};
#[derive(serde::Deserialize)]
struct Response {
version: String,
}
struct YourOwnRegistry;
impl Registry for YourOwnRegistry {
const NAME: &'static str = "your_own_registry";
fn get_latest_version<T: HttpClient>(http_client: GenericHttpClient<T>, pkg: &Package) -> Result<Option<String>> {
let url = "https://turbo.rust-lang.net.cn/api/binaries/version";
let resp = http_client.get::<Response>(&url)?;
Ok(Some(resp.version))
}
}
let informer = update_informer::new(YourOwnRegistry, "turbo", "0.1.0");
informer.check_version();
使用自己的HTTP客户端
您可以使用自己的HTTP客户端来检查更新。例如,isahc
use isahc::ReadResponseExt;
use std::time::Duration;
use serde::de::DeserializeOwned;
use update_informer::{http_client::{HeaderMap, HttpClient}, registry, Check};
struct YourOwnHttpClient;
impl HttpClient for YourOwnHttpClient {
fn get<T: DeserializeOwned>(
url: &str,
_timeout: Duration,
_headers: HeaderMap,
) -> update_informer::Result<T> {
let json = isahc::get(url)?.json()?;
Ok(json)
}
}
let informer = update_informer::new(registry::Crates, "crate_name", "0.1.0").http_client(YourOwnHttpClient);
informer.check_version();
测试
为了不在测试中检查更新,您可以使用FakeUpdateInformer::check_version
函数,该函数返回所需的版本
use update_informer::{registry, Check};
let name = "crate_name";
let version = "0.1.0";
#[cfg(not(test))]
let informer = update_informer::new(registry::Crates, name, version);
#[cfg(test)]
let informer = update_informer::fake(registry::Crates, name, version, "1.0.0");
if let Some(version) = informer.check_version().ok().flatten() {
println!("New version is available: {}", version);
}
集成测试
要在集成测试中使用FakeUpdateInformer::check_version
函数,您必须首先将功能标志添加到Cargo.toml
[features]
stub_check_version = []
然后在您的代码和集成测试中使用此功能标志
use update_informer::{registry, Check};
let name = "crate_name";
let version = "0.1.0";
#[cfg(not(feature = "stub_check_version"))]
let informer = update_informer::new(registry::Crates, name, version);
#[cfg(feature = "stub_check_version")]
let informer = update_informer::fake(registry::Crates, name, version, "1.0.0");
informer.check_version();
用户
MSRV
最低支持Rust版本:1.56.1
赞助商
update-informer由Evrone创建并支持
许可证
依赖项
~3–17MB
~291K SLoC