重新导出 proc 宏会导致“未解析的 extern crate”错误

问题描述 投票:0回答:1

概述

我正在尝试从

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`
}
rust rust-cargo
1个回答
0
投票

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
,你就无法真正解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.