我正在尝试从
Maud重新导出
html
宏,但每当我尝试使用重新导出的宏时,都会收到“未解析的外部板条箱”。
如何从我自己的板条箱中重新导出此宏?
我正在使用 Cargo 工作区。我正在从板条箱
a
重新导出宏,并尝试在板条箱 b
中使用它。
我省略了我认为不相关的行。如果有遗漏的细节请评论,我会添加它们。
# Cargo.toml
[workspace]
members = ["a", "b"]
resolver = "2"
[workspace.dependencies]
a = { path = "a" }
maud = "0.26.0"
a
# a/Cargo.toml
[package]
name = "a"
[dependencies]
maud.workspace = true
// a/src/lib.rs
pub use maud::html;
b
# b/Cargo.toml
[package]
name = "b"
[dependencies]
a.workspace = true
// b/src/lib.rs
use a::html;
fn test() {
let markup = html!{ "hello" };
// ^^^^^^^^^^^^^^^^
// unresolved extern crate
// can't find crate for `maud`
}
maud::html
宏只是在其令牌输出中发出::maud
,因此除了要求用户也导入maud
之外,您实际上无能为力,除非您想编写自己的接受的包装器自定义的箱子名称。
这个问题在 decl 宏中使用
$crate
得到了更好的解决,所以如果你可以修改 maud proc 宏代码,你可能需要添加一个像这样的 decl 宏:
// maud/src/lib.rs
macro_rules! html {
($($tt:tt)*) => { $crate::maud_macros::html! {
{$crate}
$($tt)*
}
}
并修改 proc 宏代码以读取前导
{$crate}
令牌树。
但是,否则如果不要求用户在所有板条箱中导入
maud
,你就无法真正解决这个问题。