为什么 proc-macros 必须在 proc-macro crate 中定义?

Why do proc-macros have to be defined in proc-macro crate?

我试图为我的特征创建一个派生宏,以简化一些事情。

我遇到了一些问题:

the #[proc_macro_derive] attribute is only usable with crates of the proc-macro crate type

并且,在小修复之后 proc-macro=true

proc-macro crate types cannot export any items other than functions tagged with #[proc_macro_derive] currently functions tagged with #[proc_macro_derive] must currently reside in the root of the crate`

这种行为的原因是什么?

过程宏与代码中的普通依赖项有着根本的不同。一个普通的库只是链接到你的代码中,但是一个过程宏实际上是一个编译器 plugin.

考虑 cross-compiling 的情况:您正在 Linux 机器上工作,但正在构建 WASM 项目。

  • 一个普通的 crate 将是 cross-compiled,生成 WASM 代码并与其余的 crate 链接。
  • A proc-macro crate 必须本地编译,在本例中为 Linux 代码,与当前编译器运行时(稳定版、测试版、夜间)链接,并在编译时由编译器本身加载实际使用它的板条箱。它将不会链接到其余的板条箱(不同的体系结构!)。

而且由于编译流程不同,包类型也必须不同,这就是为什么需要proc_macro=true

关于此限制:

proc-macro crate types cannot export any items other than functions tagged with #[proc_macro_derive]

好吧,由于 proc-macro crate 是由编译器加载的,没有链接到您的其他 crate,因此您从这个 crate 导出的任何非 proc-macro 代码都将无用。

请注意,错误消息并不准确,因为您还可以使用 #[proc_macro].

导出函数 tagget

关于其他限制:

functions tagged with #[proc_macro_derive] must currently reside in the root of the crate

目前不支持在嵌套模块中添加 proc_macroproc_macro_derive 项目,并且似乎不是特别有用,恕我直言。