问题描述
我有一个带有宏的proc宏板条箱,当扩展该宏时,需要对Rust内置类型使用自定义特征实现。我试图在同一条板条箱中定义特征,但是Rust告诉我proc-macro条板箱只能有公共宏(带有#[proc_macro]
注释的函数),其他任何事物都不能是公共的。因此,我将特征放入另一个板条箱中,并将它作为依赖宏放入proc-macro板条箱中。但是,这意味着任何想要使用我的proc宏板条箱的人也必须依赖于其他特征板条箱。
所以我想知道是否存在 可以将公共特征添加到proc-macro板条箱,或者以某种方式使proc-macro和trait板条箱链接起来以便最终用户可以试着没有一个就不要使用?如果不可能,唯一的解决方案就是记录依赖关系,这很脆弱。
解决方法
通常解决此问题的方法是完全不让用户依赖于您的proc-macro crate。
您的问题可以用3个板条箱解决:
- “内部”板条箱,其中包含proc-macro使用的类型和特征定义
- proc-macro板条箱:
- 取决于内部箱子,因此可以使用其类型和特征
- “公共”板条箱:
- 取决于内部和proc宏板条箱
- 重新导出您希望用户使用的所有类型,特征和宏
只要您的宏在其生成的代码中提及共享类型,就需要使用完全限定的名称,以便用户也无需导入它们。
这种模式在野外流行的一些例子:
-
thiserror
取决于包含实际宏的thiserror-impl
-
pin-project
取决于pin-project-internal
,后者又包含宏 -
darling
取决于darling-core
和darling-macro
,后者本身也取决于darling-core