#cargo-install #cargo #install #local #version #symlink #better

bin+lib cargo-local-install

封装 cargo install 以实现更好的本地、非冲突安装

13 个版本

0.1.12 2022年9月7日
0.1.11 2022年6月18日
0.1.10 2022年4月24日
0.1.9 2020年10月29日

183Cargo 插件 中排名

Download history 5/week @ 2024-03-09 1/week @ 2024-03-16 24/week @ 2024-03-30 4/week @ 2024-04-06

每月 74 次下载
cargo-container 中使用

Apache-2.0 OR MIT

57KB
785

cargo-local-install

封装 cargo install 以实现更好的本地、非冲突安装

GitHub crates.io docs.rs %23![forbid(unsafe_code)] rust: stable License

想要编写脚本 cargo install cargo-web --version 0.6 --root my-project 以避免与其他项目的版本冲突吗?
讨厌有成千上万份 cargo-web 0.6.26 的副本,并且如果你选择这条路,等待它构建?
cargo-local-install 现在为你提供支持,并将创建全局缓存中的可重复使用的 bins 的符号链接

快速入门

# no dependencies, builds in < 3 seconds on my machine
cargo install cargo-local-install --no-default-features

# slow first builds that create new exes
cargo local-install --locked cargo-web --version "^0.6" --root project-a # symlinks project-a/bin/cargo-web.exe
cargo local-install --locked cargo-web --version "^0.5" --root project-b # symlinks project-b/bin/cargo-web.exe

# fast cached builds that reuse existing exes
cargo local-install --locked cargo-web --version "^0.6" --root project-c # symlinks project-c/bin/cargo-web.exe
cargo local-install --locked cargo-web --version "^0.6"                  # symlinks bin/cargo-web.exe

# Adds Cargo.toml metadata support, < 30 seconds
cargo install cargo-local-install

选项大致类似于 cargo install,但有几点需要注意

  • --locked 被强烈推荐(默认情况下会警告,除非使用 --locked--unlocked
  • --list--no-track--features--bin--example 不受支持
  • --frozen--offline 不受支持(也不认为它们在 cargo install 中有效!)
  • -Z <标志> 不受支持

或者,您可以在Cargo.toml中指定工作空间或包元数据,类似于 [dependencies],这些将由 cargo local-install 安装。

[workspace.metadata.local-install]
cargo-web = "0.6" # == "^0.6" - includes "0.6.26" - locked by default
cargo-web = { version = "0.6", registry = "crates.io", locked = false } # `locked = false` ignores cargo-web's Cargo.lock
cargo-web = { path = "../cargo-web" }
cargo-web = { git = "https://github.com/koute/cargo-web" }
cargo-web = { git = "https://github.com/koute/cargo-web", branch = "master" }
cargo-web = { git = "https://github.com/koute/cargo-web", rev = "a9895bf536e8ac6a0806382886b7be90138f01f3" }

# not (yet?) implemented:
#   features = [...]
#   default-features = false
#   optional = true

什么?为什么?

cargo install 很好,但也有几个缺点。

  • 全局 ~/.cargo/bin 目录一次只能包含一个安装的包版本 - 如果你有一个项目依赖于 cargo web 0.5,而另一个项目依赖于 cargo web 0.6,那你就麻烦了。
  • 使用 --root my/project 强制本地安装以避免全局版本冲突意味着你必须为每个项目重新构建整个依赖项,即使你在之前100个项目中使用了完全相同的版本。
  • 在构建类似二进制文件时,缺乏目标目录缓存意味着整个依赖树必须从头开始重新构建。

cargo local-install 尝试解决这些问题

  • (Ab)uses --target-dir 来共享构建的依赖项。
  • 创建一个全局二进制缓存,但默认情况下在 ./bin 中安装一个符号链接(如果失败则复制)。

替代方案:sccache

  • github
  • 优点:可以与 cargo-local-install 结合使用,无需挑选!
  • 优点:为所有内容缓存中间构建的crates,而不仅仅是安装的bins
  • 优点:网络缓存选项,可以与他人共享
  • 缺点:如果你是从源安装sccache的怪人,会有数百个依赖项
  • 缺点:缓存丢失很多,至少在使用 cargo install ... 时是这样

以下是一些配置了 global .cargo/config rustc-wrapper 的本地测试的某些具体数字

对于本地磁盘配置的sccache 时间 备注
cargo安装 cargo-web --roota 3m 38s 干净的缓存,没有下载
cargo安装 cargo-web --roota ~ 1 s cargo install 无操作
cargo安装 cargo-web --rootb 1m 21s 基于跳跃进度速度的许多缓存失败?
使用本地安装(没有sccache) 时间 备注
cargo本地安装 cargo-web --rootc 3m 03s 干净的缓存,没有依赖项下载
cargo本地安装 cargo-web --rootc ~ 1 s cargo install 无操作
cargo本地安装 cargo-web --rootd ~ 1 s cargo local-install 产生的轻微缓存命中

许可

许可方式为以下之一

任选其一。

贡献

除非你明确表示,否则你提交给作品中的任何贡献,根据Apache-2.0许可证的定义,应按上述方式双许可,无需任何附加条款或条件。

依赖项

~210KB