#registry #yank #dependencies #cargo-lock #长期支持 #向后兼容

bin+lib lts

拉取他人的crates。对于使用旧编译器和避免损坏的依赖项很有帮助

10个版本

使用旧的Rust 2015

0.3.1 2021年5月16日
0.3.0 2021年5月16日
0.2.0 2021年5月15日
0.1.6 2021年4月16日
0.1.4 2019年8月31日

#484 in Cargo插件


用于cargo-lts

Apache-2.0 OR MIT

29KB
675

Rust依赖项的LTS

你需要Rust的长期支持版本吗?这不会发生。但是这里有另一种选择:去除不兼容的依赖项。此工具创建crates.io注册表的本地分支,并允许你从中拉取任何crates。

它是如何工作的?

它将crates.io注册表克隆到本地目录,并在.cargo/config中启用Cargo的源替换功能。Cargo仍然认为它使用crates.io注册表,但从中本地目录获取。 Cargo.lock仍然与crates.io注册表兼容!

可以随意修改本地分支。目前支持任意crates的拉取和取消拉取。

安装

cargo install -f lts --vers=0.3.0-alpha.1

要求

  • Rust 1.19或更高版本(这已经非常旧,连Debian都有它),
  • git命令在PATH中。

在macOS和Linux上进行了测试。

用法

拉取crates

在项目的目录(其中包含Cargo.toml)中执行cd,然后运行

cargo lts yank "SPEC"

其中SPEC是crate的名称后跟semver范围,之间没有空格。Semver范围以>=<==开头,后跟一个版本。它必须加引号(因为<>是shell特殊字符)。例如,要拉取serde版本1.0.118和所有更新的serde版本,请运行

cargo lts yank "serde>=1.0.118"

首次运行时将设置注册表分支,这可能需要一分钟。拉取或取消拉取后运行cargo updatecargo generate-lockfile以将更改应用到你的Cargo.lock

可以同时拉取多个crates

cargo lts yank "backtrace<=0.1.8" "gcc<=0.3.0" "lazy_static<=0.1.0" "libc^0.1.0" "mio<=0.3.7" "mio=0.6.0" "nix=0.5.0" "num<=0.1.25" "pkg-config<=0.3.2" "rand<=0.3.8" "rustc-serialize<=0.3.21" "semver<=0.1.5" "void<=0.0.4" "winapi<=0.1.17"

更新注册表

cargo lts update

请注意,仅使用 cargo update 命令本身无法从 crates.io 仓库获取新的创建项,因为它被设置为使用本地分支。您需要使用 cargo lts update 来更新本地分支。

禁用仓库覆盖

这将删除分支并将配置恢复到正常状态

cargo lts reset

或者您可以自己编辑 .cargo/config 并删除 replace-with 行。

但是为什么呢?

semver 不应该是完美的吗?

有些 crate 由于意外损坏或作者意见不一致而出现了破坏性变更。例如,许多 Rust 项目不认为增加最小支持的 Rust 版本(MSRV)是 semver 破坏性变更。

为什么不使用 [dependencies] 锁定版本?

通过设置严格的版本要求,以及/或者策略性地在您的 crate 的 Cargo.toml 中添加间接依赖,可以避免有问题的依赖项。如果您必须为所有使用您 crate 的用户强制执行此组依赖项,这是一个最坏的选择。

然而,在 Cargo.toml 中过度严格的库版本(例如,crate = "=1.2.3")可能会导致冲突,这对下游用户来说非常不愉快。

使用 cargo lts,您可以生成包含您想要的依赖项的 Cargo.lock 文件,而无需更改 Cargo.toml。这适用于私有或临时修补依赖项版本,且不会污染 Cargo.toml

Cargo.toml 中的覆盖是项目特定的,但使用 cargo lts yank 可以编写脚本并在多个项目之间重用。

为什么不使用 [patch]

修补功能在不更改版本的情况下更改依赖项的代码。cargo lts 不更改依赖项的代码,但更改其版本。

依赖项

~3MB
~70K SLoC