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 过程宏
5,291,122 每月下载量
用于 7,938 个crate(305个直接使用)
23KB
370 行
proc-macro-crate
为过程宏提供对$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