代码之家  ›  专栏  ›  技术社区  ›  ajp

如何忽略基于特征标志的某些属性(没有cfg_attr)?

  •  0
  • ajp  · 技术社区  · 3 年前

    我的板条箱有一个“追踪”功能。当它打开时,我包括依赖项 tracing , tracing_subscriber 等。当它被关闭时,这些依赖关系也被关闭,这意味着使用这些板条箱中的函数/宏/属性将无法编译。

    对于函数和宏,我可以有条件地定义存根版本,使其成为非操作,例如。

        macro_rules! info {
            ($($arg:tt)*) => {};
        }
        pub(crate) use info;
    

    是否可以对属性执行同样的操作,特别是 instrument 属性我不想重写所有要使用的调用站点 cfg_attr ,我宁愿在一个地方处理切换行为。

    额外的问题:对于这种情况,这是一个合理的方法吗?我想我不是第一个想做这种事的人。

    0 回复  |  直到 3 年前
        1
  •  0
  •   Hugo Mota    3 年前

    如评论中所述 tracing 指出图书馆只应依赖 跟踪 并将数据的实际消耗留给应用程序。

    库应该只依赖于跟踪板条箱,并使用提供的宏和类型来收集对下游消费者可能有用的任何信息。

    由于您正试图摆脱插入调用,您可能会担心开销。 Documentation 声明:

    出于性能原因,如果没有当前活动的收集器通过返回true来表达对给定元数据集的兴趣,那么将永远不会构造相应的Span或Event。

    编译器也热衷于去除你从未使用过的东西。你想摆脱的开销很有可能为零。当然,为了确保您需要运行基准测试或检查程序集代码。

    这个 Tokio project 是这个板条箱的维护者,所以你也可以加入他们的 Discord server 并询问社区。

    推荐文章