#[cfg(test)] 放在 lib.rs 顶部时会做什么?

2024-02-29

我正在编写一个带有单元测试的 Rust 库(从 Cargo 生成)。

我想使用外部板条箱maplit https://docs.rs/maplit/1.0.2/maplit/在我的单元测试中能够使用类似 JavaScript 的哈希图文字。我不想在我的库代码中使用 maplit。

maplit 提供了一个显然必须使用#[macro_use] 激活的宏。我能够让这一切正常工作的唯一方法是将其放在顶部lib.rs:

#[cfg(test)] #[macro_use] extern crate maplit;

// my crate-specific stuff

此时我意识到我不知道 #[cfg(test)] 到底是做什么的。我在测试中使用它。按照惯例,它们包含在库代码中,如下所示:

// some library code

#[cfg(test)]
mod test {
  use super::*;
  // tests here
}

我原以为 #[cfg(test)] 行将文件(或块?)末尾之前的内容标记为仅适用于测试配置。

如果是这样,则将此指令放在顶部lib.rs似乎是一个问题。当我编译发行版时,我的整个库不会被删除吗?

我试图找到有关 #[cfg(test)] 到底做什么的文档,但无济于事。


#[....]

上面是一个生锈属性 https://doc.rust-lang.org/reference/attributes.html这就像其他语言中的注释。例如;在Java中我们有@Annotation(....)对于方法和类。与注释不同,rust 属性可以是遵循属性语法的表达式。

#[cfg(....)]

上面是一个编译器配置 https://doc.rust-lang.org/reference/conditional-compilation.html#the-cfg-attribute属性。这cfg()是众多之一内置属性 https://doc.rust-lang.org/reference/attributes.html#built-in-attributes-index.

#[cfg(test)]

上面的代码告诉 Rust 编译器,只有在以下情况下才应该编译以下代码:test配置是active。您可以拥有其他配置属性,例如debug, windows或特征。

#[cfg(test)] #[macro_use] extern crate maplit;

是相同的

#[cfg(test)]
#[macro_use]
extern crate maplit;

这告诉 Rust 编译器仅编译下一行,如果test配置处于活动状态,下一行告诉 Rust 仅使用macros从下面的箱子里。

如果是这样,那么将此指令放在 lib.rs 的顶部似乎是一个问题。当我编译发行版时,我的整个库不会被删除吗?

The #[cfg(...)]属性仅适用于编译器条件在事物上它被附加到。

当您将属性放在文件顶部时,后跟一个空格。该属性附加到当前模块或 crate。

如文档示例所示,crate_type应用于整个文件:

// General metadata applied to the enclosing module or crate.
#![crate_type = "lib"]

// A function marked as a unit test
#[test]
fn test_foo() {
    /* ... */
}

// A conditionally-compiled module
#[cfg(target_os = "linux")]
mod bar {
    /* ... */
}

// A lint attribute used to suppress a warning/error
#[allow(non_camel_case_types)]
type int8_t = i8;

// Inner attribute applies to the entire function.
fn some_unused_variables() {
  #![allow(unused_variables)]

  let x = ();
  let y = ();
  let z = ();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#[cfg(test)] 放在 lib.rs 顶部时会做什么? 的相关文章

随机推荐