我正在创建一个库,它几乎是它的第一个版本,所以我想上传到crates.io.库有一个多 crate 设计,所以我以这样的方式结束:

- CrateA
- CrateProcMacros
- CrateC
- CrateD
- CrateE
- CrateF
- Cargo.toml (handles the workspace)
- Cargo.lock
...

其中CrateA是其他 crate 的父项,并依赖于这些本地 crate 中的另一个,其中一些 crate 也依赖于另一个 crate .我的意思是,它是库的主箱,负责公开项目的公共API,也是我希望在crates.io中发布的唯一的一个.

读取我看到的cargo docs,我将无法向注册表发布唯一的 crate .所有内容都将被上传并发布.

那么,我有什么方法可以只将我的CrateA发布到注册表中呢?我是不是应该改变我的项目 struct ,把所有其他的包都移到CrateA,然后再试着发布它?或者有什么方法可以做到这一点?

编辑

CrateA个直接依赖于另一个 crate .这些人也依赖于我工作区内的另一个人.

推荐答案

Cargo 包装的工作方式是you are publishing your source code几乎没有变化.没有预编译步骤.不存在将多个库箱集中到一个包中的步骤.发布CrateAonly方法是也发布它的所有依赖项.

让一个多机箱项目更容易发布是有兴趣的,但现在,你必须明确地完成所有这一切.

  1. 确保项目中的每个包都在公共场合声明了[package] name.(您保存它的目录的名称并不重要.)通常会有像myproject-partoftheproject这样的名称,人们实际使用的包通常会被命名为myproject.

  2. 确保每个依赖项声明都有一个与您要发布的内容匹配的version数字(而不仅仅是path).(您不必删除path;这将在出版物中为您完成.)

  3. 发布每个包.您必须以相反的依赖关系顺序执行此操作-即,最后为CrateA.

没有人会介意您发布了不打算直接使用的额外包-例如,许多库都必须有单独的proc宏包.但是,如果您有真正just%用于代码组织并且没有任何特别好处的箱子,您可以考虑在更少的箱子中将它们制成模块.

Rust相关问答推荐

将JSON密钥转换为Polars DataFrame

Box::new()会从一个堆栈复制到另一个堆吗?

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

无法定义名为&new&的关联函数,该函数的第一个参数不是self

为什么这个变量不需要是可变的?

获取已知数量的输入

RUST 中的读写器锁定模式

Rust LinkedList 中的borrow 判断器错误的原因是什么?

Button.set_hexpand(false) 不会阻止按钮展开

Rust 中指向自身的引用如何工作?

为什么数组不像向量那样在 for 块之后移动?

哪些特征通过 `Deref` 而哪些不通过?

在每个循环迭代中删除borrow

在 Rust 中,为什么整数溢出有时会导致编译错误或运行时错误?

Rust 将特性传递给依赖项

为什么 Rust 允许写入不可变的 RwLock?

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

实现不消费的迭代器

编写 TOML 文件以反序列化为 struct 中的枚举

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?