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插件
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 update
或cargo 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