#proc-macro #cargo-toml #macro #macro-rules #crates #replace #cargo-manifest

proc-macro-crate

过程宏中的crate (macro_rules关键字) 替代方案

17个版本 (11个稳定版)

3.1.0 2024年1月17日
2.0.2 2024年1月29日
2.0.1 2023年12月6日
2.0.0 2023年10月3日
0.1.3 2019年2月11日

#3 in 过程宏

Download history 1223334/week @ 2024-04-22 1128422/week @ 2024-04-29 1143791/week @ 2024-05-06 1202138/week @ 2024-05-13 1173194/week @ 2024-05-20 1145042/week @ 2024-05-27 1226856/week @ 2024-06-03 1210695/week @ 2024-06-10 1177064/week @ 2024-06-17 1201708/week @ 2024-06-24 1162350/week @ 2024-07-01 1278113/week @ 2024-07-08 1234794/week @ 2024-07-15 1313647/week @ 2024-07-22 1302368/week @ 2024-07-29 1371499/week @ 2024-08-05

5,291,122 每月下载量
用于 7,938 个crate(305个直接使用)

MIT/Apache

23KB
370

proc-macro-crate

Build Status

为过程宏提供对$crate的支持。

简介

macro_rules!中,$crate用于获取声明宏的crate路径。在过程宏中,目前没有简单的方法来获取这个路径。一个常见的技巧是导入一个已知名称的crate并使用它。然而,随着rust edition 2018的发布和从lib.rs中删除extern crate声明,人们开始直接在Cargo.toml中重命名crate。然而,这会破坏导入,因为过程宏开发者不知道应该导入的crate的重命名名称。

此crate提供了一个方法来获取crate的名称,即使它在Cargo.toml中进行了重命名。为此,提供了一个名为crate_name的单个函数。该函数需要在具有所需crate名称的过程宏上下文中调用。CARGO_MANIFEST_DIR将用于查找当前活动的Cargo.toml,并在此Cargo.toml中搜索所需的crate。

示例

use quote::quote;
use syn::Ident;
use proc_macro2::Span;
use proc_macro_crate::{crate_name, FoundCrate};

fn import_my_crate() {
    let found_crate = crate_name("my-crate").expect("my-crate is present in `Cargo.toml`");

    match found_crate {
        FoundCrate::Itself => quote!( crate::Something ),
        FoundCrate::Name(name) => {
            let ident = Ident::new(&name, Span::call_site());
            quote!( #ident::Something )
        }
    };
}

边缘情况

在确定正确crate时存在多个边缘情况。例如,如果您像这样将crate作为自己的依赖项导入

[package]
name = "my_crate"

[dev-dependencies]
my_crate = { version = "0.1", features = [ "test-feature" ] }

该crate将返回FoundCrate::Itself,并且您将无法在dev-dependencies中找到您crate的其他实例。其他类似情况是当某个crate被多次导入时

[package]
name = "my_crate"

[dependencies]
some-crate = { version = "0.5" }
some-crate-old = { package = "some-crate", version = "0.1" }

在当前 Cargo.toml 中搜索 some-crate,它将返回 FoundCrate::Name("some_old_crate"),即 Cargo.toml 中该crate的最后定义。

许可协议

许可证为以下之一

任选其一。

许可证:MIT 或 Apache-2.0

依赖项

~1.5MB
~23K SLoC