在多个crate的项目中只发布一个父crate

3

我正在创建一个图书馆,它快要发布第一个版本了,所以我想将它上传到crates.io。这个库有一个多箱设计,所以最终我得到了类似这样的东西:

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

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

阅读cargo文档,我发现我无法将唯一的crate发布到注册表中。所有内容都将被上传和发布。

那么,我有什么替代方案可以只将我的CrateA发布到注册表中吗?我应该更改项目的结构,将所有其他包移动到CrateA中,然后尝试发布它吗?还是有其他方法可以实现这一点?

编辑

CrateA直接依赖于其他crate。而这些crate也依赖于工作区内的其他crate。


1
无论你做什么,都不要改变项目的结构。你选择它是有原因的。这比打包更重要。据我记得,你必须单独发布每个板条箱。 - Aleksander Krauze
2个回答

2
货物包装的工作方式是,您几乎不需要改变源代码就可以发布。没有预编译步骤。也没有将多个库箱聚集成一个包的步骤。发布您的CrateA唯一方法是同时发布其所有依赖项。

有兴趣使多箱项目更易于发布,但现在,您必须明确执行所有操作。

  1. 确保项目中的每个包都声明了一个在公共领域中有意义的[package] name。(您保存它的目录名称并不重要。)通常会使用类似myproject-partoftheproject这样的名称,其中实际上人们通常会使用的包的名称为myproject

  2. 确保每个依赖项声明都具有与您要发布的version号码(而不仅仅是path)相匹配的版本号。(您无需删除path;这将在发布中为您完成。)

  3. 发布每个包。您必须按反向依赖关系顺序进行此操作--即最后发布CrateA

没有人会介意您发布了不适用于直接使用的额外包--例如,许多库必须具有单独的proc-macro包。但是,如果您有任何仅用于代码组织且没有特定好处的箱,可以考虑将它们制作为更少的箱内的模块。


-2

主要的 Cargo.toml 应该是这样的

[workspace]
members = [
    "CrateA",
    "CrateB",
    ...
]

而CrateA/Cargo.toml应该是这样的

[package]
name = "Foo"
version = "0.0.0"
edition = "2021"
authors = ["Foo <Foo@gmail.com>"]
license = "Bar"
description = "Baz"
[dependencies]
CrateB = { path = "../CrateB", version = "0.0.0" }
CrateC = "0.0.0"

1
谢谢。工作区Cargo.toml已经像那样,剩下的Cargo.toml文件也是这样。 - Alex Vergara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接