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命令行界面

Download history 6502/week @ 2024-03-14 6772/week @ 2024-03-21 5580/week @ 2024-03-28 5932/week @ 2024-04-04 7567/week @ 2024-04-11 5894/week @ 2024-04-18 4918/week @ 2024-04-25 6322/week @ 2024-05-02 6007/week @ 2024-05-09 4986/week @ 2024-05-16 6305/week @ 2024-05-23 7256/week @ 2024-05-30 6306/week @ 2024-06-06 9191/week @ 2024-06-13 6651/week @ 2024-06-20 4257/week @ 2024-06-27

每月 27,778 次下载
用于 34 个工具包 (31 个直接使用)

MIT 许可证

53KB
1K SLoC

Update-informer

CI Version Docs.rs Codecov Downloads

update-informer

为用 Rust 编写的 CLI 应用程序更新信息 🦀

它会在 Crates.io、GitHub、Npm 和 PyPI 上检查新版本 🚀

优势

想法

这个想法其实并不新颖。这个功能早已存在于 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-informerEvrone创建并支持

许可证

MIT

依赖项

~3–17MB
~291K SLoC