有没有办法在 proc-macro 箱中拥有公共特征?

jec*_*lon 5 traits rust rust-crates rust-proc-macros

我有一个 proc-macro 箱,其中有一个宏,当扩展时,需要使用 Rust 内置类型的自定义特征实现。我试图在同一个板条箱中定义该特征,但 Rust 告诉我,一个 proc-macro 板条箱只能有公共宏(用 注释的函数#[proc_macro]),其他任何东西都不能是公共的。因此,我将该特征放入另一个板条箱中,并将其作为依赖项包含在 proc-macro 板条箱中。但这意味着任何想要使用我的 proc-macro 板条箱的人也必须依赖于其他特征板条箱。

所以我想知道是否有一种方法可以向 proc-macro 板条箱添加公共特征,或者以其他方式使 proc-macro 和特征板条箱以某种方式链接起来,以便最终用户无法尝试在没有另一个的情况下使用一个?如果两者都不可行,唯一的解决方案是记录依赖关系,这有点脆弱。

Pet*_*all 10

通常处理这个问题的方法是根本不让用户依赖你的 proc-macro crate。

你的问题可以用 3 个箱子来解决:

  • “内部”包,包含 proc-macro 使用的类型和特征定义
  • proc-宏箱:
    • 取决于内部箱子,因此可以使用其类型和特征
  • “公共”箱子:
    • 取决于内部和 proc-macro 包
    • 重新导出您希望用户使用的所有类型、特征和宏

每当您的宏在其生成的代码中提及共享类型时,您都需要使用完全限定名称,以便用户不需要导入它们。


这种模式在野外的一些流行示例:

  • thiserror取决于thiserror-impl哪个包含实际的宏
  • pin-project取决于pin-project-internal哪个再次包含宏
  • darling取决于darling-coredarling-macro,它本身也取决于darling-core