< 返回版块

Mike Tang 发表于 2025-03-29 21:29

ts-result - 受不了TypeScript中的错误处理方式而开发的库

作者受不了TypeScript中的错误处理方式,而学习Rust的设计实现了ts-result。Rust的错误处理是目前业界的典范。

https://trylonai.github.io/ts-result/ts-result-blog-post.html

对MSRV的吐槽

MSRV 是 Minimum Supported Rust Version(最低支持 Rust 版本)的缩写。它指的是一个 Rust 项目(如库或应用程序)明确声明支持的最低 Rust 编译器版本。换句话说,如果你的 Rust 编译器版本低于某个 crate(Rust 的库或包)指定的 MSRV,你可能无法成功编译或使用该 crate。

在 Rust 生态系统中,MSRV 是一个重要的概念,因为 Rust 语言本身没有像某些其他语言那样的长期支持版本(LTS),而是采用每六周发布一个新稳定版本的滚动更新模式。这意味着随着时间的推移,新的语言功能、标准库改进和工具(如 Cargo)的更新会不断引入,而 crate 的维护者需要决定他们的项目支持的最低版本是什么。

总体来说,我觉得整个 MSRV(最低支持 Rust 版本)的处理方式从根本上就是错误的。我不想要帮助我使用支持旧 Rust 版本的旧版 crate 的工具。我想要的是帮助我继续发布支持旧 Rust 版本的新版 crate 的工具(同时在可用时利用新功能)。 例如,我想要:

根据 rustc 版本有条件地编译代码的能力

根据 rustc 版本有条件地添加依赖的能力

使用新的 Cargo.toml 功能,例如 dep:,并为兼容旧版 rustc 提供回退选项

我还觉得,除非我们讨论的是像 libc 这样永远不能发布破坏性版本的“永久稳定” crate,否则我们应该将 MSRV 的提升视为破坏性变更。因为实际上它们确实会破坏人们的构建。

我遇到的具体问题: 许多 crate 在非 semver 破坏性版本中提升了它们的 MSRV,这会悄无声息地提升其依赖项的 MSRV

Cargo 工作区对混合 MSRV 的支持不好,包括测试、基准测试和示例。像 criterion 和 env_logger 这样的 crate(相当合理地)有激进的 MSRV,所以如果你想要一个较低的 MSRV,那么你就无法在测试/基准测试/示例中使用这些 crate

对 Cargo.toml 的破坏性更改没有任何向后兼容性保证。例如,在整个工作区中任何 crate 的任何依赖的 Cargo.toml 中使用 dep: 语法,会导致使用 rustc <1.71 时编译完全失败,实际上使得 1.71 成为广泛使用依赖的 crate 的最低支持版本

最近的一些发展,比如 Cargo.toml 中的 rust-version 键,似乎让事情变得更糟: rust-version 阻止 crate 编译,即使它们实际上可以用较低的 Rust 版本编译。声明一个 Rust 版本似乎很有用,但为什么这是一个硬性错误而不是警告呢?

许多 crate 将它们的 rust-version 提升到高于实际需要的水平(随意增加 MSRV)

MSRV 感知的解析器让人们更愿意激进地提升 MSRV,尽管解析到旧版本的 crate 并不是一个好的解决方案

举个例子: home crate 最近将 MSRV 从 1.70 提升到 1.81,尽管它实际上仍然可以用较低版本编译(除了 Cargo.toml 中的 rust-version 键)

MSRV 感知的解析器直到 1.84 才可用,所以在这里帮不上忙

即使 MSRV 感知的解析器可用,这次更改还伴随着对 windows-sys crate 的提升,这意味着你会停留在旧版本的 windows-sys 上。随着生态系统的其余部分继续发展,这很可能意味着你的依赖树中会有多个版本的 windows-sys。这不好,而且这似乎是 MSRV 感知解析器的常见情况,而不是例外

home 确实表示它不打算给外部(非 cargo 团队)使用,所以他们可能在这方面可以被原谅。但最终结果仍然是我无法轻松地维持较低的 MSRV 了。

/发泄完毕

只有我对此感到沮丧吗?其他人对 MSRV 的体验如何? 我很想完全不关心 MSRV(我自己的项目都使用“最新稳定版”编译),但作为一个库开发者,我感觉自己被夹在关心 MSRV 的人(我需要为他们保持较低的 MSRV)和不关心的人(他们让这变得困难)之间。

tysm - OpenAI API的又一个非官方Rust SDK

目前支持:

  • Chat-Completions API
    通过结构化输出提供类型安全的 API 响应
    自动生成模式(schema)
    自动反序列化
    简洁的接口
    API 响应的自动本地缓存
    支持批量 API

  • Embeddings API
    支持单次和批量请求(但不支持通过批量 API)
    提供向量相似性函数

  • Files API
    创建、列出、下载和删除文件

https://github.com/not-pizza/tysm/

--

From 日报小组 Mike

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页