← 中文资源

简体中文版本

Rust proc-macro crate 不可用 — 宏导入失败

通过分离 proc-macro crate 并通过门面导入 derive 宏,修复 “proc-macro crate not available” 与未解析的 derive 错误。

阅读英文原文

症状

本篇指南处理“Rust proc-macro crate 不可用 — 宏导入失败”。请从症状出发,按顺序执行诊断,在推进前确认每个假设;随后通过修复与验证步骤闭环。

可观察到的症状包括:

  • error: proc-macro crates cannot export items other than macros
  • error[E0433]: failed to resolve: could not find X in Y
  • 仅在下游 crate 中 derive 宏失败

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

grep -n "proc-macro" Cargo.toml

定义 derive 的 crate 必须在 [lib] 下声明 proc-macro = true,否则无法定义 derive。

步骤 2

cargo build 2>&1 | grep -E "proc-macro|E0433" | head

解析失败会指出 crate 与项,说明是导出还是依赖配置有误。

常见诱因(按出现频率排序):

  • proc-macro crate 试图导出普通项,或作为普通依赖使用
  • derive 宏定义在未设置 proc-macro = true 的 crate 中
  • 宏未通过必要的 pub use 或门面 crate 再导出

根因

proc-macro crate 会编译为编译器插件,只能导出宏。若它同时导出 trait 或函数,构建会失败;使用方必须通过合法导出该宏的 crate 导入。

修复

拆分 crate:让 proc-macro crate 只定义宏,把共享项移到普通库 crate,并通过门面再导出 derive,使用户只导入一个 crate。

注意:更改 crate 类型会破坏既有导入路径;应提供门面并逐步弃用旧路径。

# Cargo.toml of the proc-macro crate
[lib]
proc-macro = true

[dependencies]
syn = "2"
quote = "1"

# Facade crate re-exports the derive so users import one path
# lib.rs
pub use my_derive::MyTrait;

验证

cargo build 通过且下游 crate 可 derive 该宏;cargo doc 显示宏由门面导出。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。