我是否需要对所有主要项目都这样做?或者我可以在宏箱的 Cargo.toml 中声明依赖吗?
您可以通过 (1) 让宏调用库中的函数或 (2) 重新导出 chrono(部分或全部)。
假设我们有一个工作区,有一个 lib 和 bin 板条箱。
[workspace]
members = [
"bin",
"lib",
]
现在,在 Cargo.toml 的 lib crate 中,您可以将 chrono 作为依赖项包含在内,就像其他方式一样。
[dependencies]
chrono = "0.4"
而 bin 板条箱的 Cargo.toml 仅具有 lib 的依赖关系。
[dependencies]
lib = { path = "../lib" }
现在,让我们考虑 main.rs 在 bin crate 中的样子:
use lib::time;
fn main() {
time!();
}
无论你选择哪个选项,它都将保持不变。
下面的sn-ps代表lib.rs。
库函数
如果您实际上从未返回任何chrono 特定类型,那么这可能是最简单的。因为您避免完全重新导出 chrono。
use chrono::{DateTime, Local};
pub fn _time() {
let local_datetime: DateTime<Local> = Local::now();
println!("{:?}", local_datetime);
}
#[macro_export]
macro_rules! time {
() => {
$crate::_time();
};
}
如果您不希望 _time 出现在您的库的文档中,那么您可以使用 #[doc(hidden)] 属性。
重新出口一些物品
或者,如果您希望所有内容都保留在宏中,则可以重新导出它使用的 chrono 类型,并在宏中的类型前面加上 $crate::。
这样做的缺点是,如果您的 bin crate 需要一个未重新导出的 chrono 类型,那么这可能是一个“烦恼”,因此 bin 将需要依赖于 chrono = "0.4"无论如何。
pub use chrono::{DateTime, Local};
#[macro_export]
macro_rules! time {
() => {
let local_datetime: $crate::DateTime<$crate::Local> = $crate::Local::now();
println!("{:?}", local_datetime);
};
}
在main.rs 中,如果你改为使用use lib::*;,那么你当然不需要在前面加上$crate::,但最好避免使用use lib::*;。
再出口计时码表
最后,如果你需要 chrono 类型在你的 bin crate 中。然后你也可以用pub extern crate chrono;重新导出整个chrono crate。
请注意,这一次,您需要在宏中的类型前面加上 $crate::chrono::。
pub extern crate chrono;
#[macro_export]
macro_rules! time {
() => {
let local_datetime: $crate::chrono::DateTime<$crate::chrono::Local> =
$crate::chrono::Local::now();
println!("{:?}", local_datetime);
};
}