如何不将crate加入依赖即可实现infra-doc链接目标crate
Rust 无正式依赖实现跨crate文档链接的方案
Rust 原生支持在文档注释中编写跨crate的内部链接,示例写法如下:
/// 链接到foo crate中的结构体 [Foo](foo::Foo)
这类链接默认要求被引用的crate必须配置在Cargo.toml的[dependencies]配置段,才能在构建文档时正常解析、支持点击跳转:
[dependencies] foo = "1.0"
如果仅需要在文档中添加这类跳转链接,不希望当前crate的正式构建引入foo依赖,常规针对测试、示例场景的方案是把依赖加到[dev-dependencies]段:
[dev-dependencies] foo = "1.0"
但这个方案存在明显缺陷:执行cargo doc命令构建正式发布文档时,这类跨crate链接无法被正常解析,点击会失效。
正确的实现方式是使用Rust提供的条件依赖配置,仅在文档构建场景引入对应依赖,完全不影响正常构建流程,配置方法如下:
[target.'cfg(doc)'.dependencies] foo = "1.0"
- 该配置段下的依赖只会在执行
cargo doc等文档构建操作时被拉取、参与链接解析 - 正常执行
cargo build、cargo check编译,或是下游用户引入当前crate时,都不会拉取、依赖foo,不会增加正式构建的冗余负担
如果需要让文档测试(doctest)场景下的跨crate链接也能正常解析,可以额外补充doctest场景的专属依赖配置,和上述配置互不冲突:
[target.'cfg(doctest)'.dependencies] foo = "1.0"
补充说明:
- 如果你不需要链接匹配本地依赖版本的内容,仅需要跳转到对应crate的公开文档站点,也可以直接在文档注释中写完整URL链接,只是这种方式无法自动同步依赖版本,灵活度远低于原生的内部链接。
内容的提问来源于stack exchange,提问作者Michael Ilyin
相关产品推荐
相关产品推荐

