引言:为什么本地 crate 不是奢侈品,而是必需品
\n\n想象一下:您正在用 Rust 编写一个用于解析配置文件的库。它还很粗糙,尚未准备好发布到 crates.io,但您已经想在一个实际项目中测试它——比如基于 Actix 的 Web 服务器或 CLI 工具。该怎么办?复制代码?创建单体仓库?不,Rust 为此提供了一个优雅的解决方案——本地未发布的 crate。
"How to use a local unpublished crate?" 这个问题在 Stack Overflow 上获得了数千次浏览。这并非偶然:每个 Rust 开发者迟早都会遇到需要连接自己尚未发布的 crate 的情况。在本文中,我们将探讨所有方法——从简单的指定路径到使用 Git 依赖和 workspaces。开始吧!
\n\n什么是未发布的 crate,为什么需要它?
\n\n未发布的 crate 是一个仅存在于您本地磁盘或私有仓库中的 Rust 包。它没有上传到 crates.io,其他开发者无法访问(除非您授予他们文件访问权限)。
典型的使用场景:
\n- \n
- 与主项目并行开发库 \n
- 重构:将部分代码提取到单独的 crate 中 \n
- 无法公开发布的私有企业库 \n
- 在发布前测试依赖项 \n
主要优势是您可以完全控制代码,并可以立即进行更改,而无需等待发布到 crates.io。
\n\n方法 1:路径依赖——最简单快捷
\n\n这是基本方法,适用于两个项目(依赖项和依赖项目)都在您本地计算机上的情况。
\n\n项目结构
\n\n假设您有以下文件夹结构:
\n\nmy_project/\n├── my_lib/ # 未发布的 crate\n│ ├── Cargo.toml\n│ └── src/\n│ └── lib.rs\n└── my_app/ # 主项目\n ├── Cargo.toml\n └── src/\n └── main.rs\n\n步骤 1:创建 my_lib 库
\n\n在 my_lib/Cargo.toml 中:
[package]\nname = "my_lib"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\n\n在 my_lib/src/lib.rs 中编写一个简单的函数:
pub fn greet(name: &str) -> String {\n format!("你好,{}!这是一个本地 crate。", name)\n}\n\n步骤 2:通过路径将 my_lib 连接到 my_app
\n\n在 my_app/Cargo.toml 中添加 [dependencies] 部分:
[package]\nname = "my_app"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nmy_lib = { path = "../my_lib" }\n\n请注意:路径是相对于主项目的 Cargo.toml 文件指定的。如果库位于其他目录,请指定绝对路径或相对路径。
步骤 3:在代码中使用 crate
\n\n在 my_app/src/main.rs 中:
use my_lib::greet;\n\nfn main() {\n let message = greet("阿列克谢");\n println!("{}", message);\n}\n\n运行:cargo run——您将看到输出:"你好,阿列克谢!这是一个本地 crate。"
重要! 对 my_lib 的任何更改都将在下次构建 my_app 时自动生效。无需重新安装或更新版本。
方法 2:Git 依赖——用于团队协作
\n\n如果您在团队中工作或代码存储在 Git 中,最好使用 Git 依赖。当 crate 位于单独的仓库(即使是私有仓库)中时,这很方便。
\n\n配置
\n\n假设您的未发布 crate my_lib 位于仓库 https://github.com/yourname/my_lib.git 中。