有没有办法在 proc-macro 板条箱中具有 public 特征?
Is there a way to have a public trait in a proc-macro crate?
我有一个带有宏的 proc-macro crate,当扩展时,需要为 Rust 内置类型使用自定义特征实现。我试图在同一个 crate 中定义 trait,但是 Rust 告诉我一个 proc-macro crate 只能有 public 宏(用 #[proc_macro]
注释的函数)并且没有别的可以是 public.所以我把特性放在另一个板条箱中,并在 proc-macro 板条箱中将其作为依赖项包含在内。但这意味着任何想要使用我的 proc-macro crate 的人也必须依赖于其他 trait crate。
所以我想知道是否有 一种方法可以将 public trait 添加到 proc-macro crate,或者以其他方式制作 proc-macro 和 trait crate以某种方式链接,因此最终用户不能尝试在没有另一个的情况下使用一个?如果两者都不可能,唯一的解决方案是记录依赖关系,这有点脆弱。
通常处理这种情况的方法是让用户完全不依赖您的 proc-macro crate。
你的问题可以用 3 个板条箱解决:
- “内部”板条箱包含 proc-macro
使用的类型和特征定义
- proc-macro 板条箱:
- 取决于内部 crate,因此它可以使用其类型和特征
- "public" 板条箱:
- 取决于内部和 proc-macro 板条箱
- Re-exports 您希望用户使用的所有类型、特征和宏
每当您的宏在其生成的代码中提及共享类型时,您需要使用 fully-qualified 名称,这样用户就不需要也导入它们。
这种模式在实际中的一些流行示例:
thiserror
取决于包含实际宏的 thiserror-impl
pin-project
取决于 pin-project-internal
,后者又包含宏
darling
依赖于darling-core
和darling-macro
,后者本身也依赖于darling-core
我有一个带有宏的 proc-macro crate,当扩展时,需要为 Rust 内置类型使用自定义特征实现。我试图在同一个 crate 中定义 trait,但是 Rust 告诉我一个 proc-macro crate 只能有 public 宏(用 #[proc_macro]
注释的函数)并且没有别的可以是 public.所以我把特性放在另一个板条箱中,并在 proc-macro 板条箱中将其作为依赖项包含在内。但这意味着任何想要使用我的 proc-macro crate 的人也必须依赖于其他 trait crate。
所以我想知道是否有 一种方法可以将 public trait 添加到 proc-macro crate,或者以其他方式制作 proc-macro 和 trait crate以某种方式链接,因此最终用户不能尝试在没有另一个的情况下使用一个?如果两者都不可能,唯一的解决方案是记录依赖关系,这有点脆弱。
通常处理这种情况的方法是让用户完全不依赖您的 proc-macro crate。
你的问题可以用 3 个板条箱解决:
- “内部”板条箱包含 proc-macro 使用的类型和特征定义
- proc-macro 板条箱:
- 取决于内部 crate,因此它可以使用其类型和特征
- "public" 板条箱:
- 取决于内部和 proc-macro 板条箱
- Re-exports 您希望用户使用的所有类型、特征和宏
每当您的宏在其生成的代码中提及共享类型时,您需要使用 fully-qualified 名称,这样用户就不需要也导入它们。
这种模式在实际中的一些流行示例:
thiserror
取决于包含实际宏的thiserror-impl
pin-project
取决于pin-project-internal
,后者又包含宏darling
依赖于darling-core
和darling-macro
,后者本身也依赖于darling-core