Cargo:如何将整个目录或文件包含在功能标志中?

New*_*ode 0 conditional-compilation rust rust-cargo

我正在开发一个 Rust 项目。我正在使用 Cargo 功能标志来对某些代码进行条件编译。在某些情况下,我必须将整个文件包含在功能标志中,因此这样做添加#[cfg(feature="my-flag")]每个函数和use语句没有多大意义。

因此,为了将整个文件包含在功能标志中,我想将文件中的所有内容包围在一个块中并为该块添加功能标志。

#[cfg(feature="my-flag")]
{
  use crate::access_control::{func1, func2};
  use crate::models;
  ...

  #[derive(Debug)]
  pub enum MyEnum{..}
  
  #[derive(Clone)]
  pub Struct MyStruct{..}

  pub fn my_func() {...}
  fn my_func_internal() {...}
  ...
}
Run Code Online (Sandbox Code Playgroud)

但我收到错误Syntax Error: expected an item after attributes

另外,在某些情况下,我希望将整个目录包含在功能标志中。我该怎么办?为每个文件添加功能标志是一种方法。是否存在更好的方法?

Jmb*_*Jmb 5

正如@MarcusDunn 的回答一样,正确的解决方案是将属性应用于声明mod

// This conditionally includes a module which implements WEBP support.
#[cfg(feature = "webp")]
pub mod webp;
Run Code Online (Sandbox Code Playgroud)

但是为了完整起见,我想指出属性可以应用于它们所在的项目,而不是应用于下一个项目。这些称为“内部属性”! ,通过在 后面添加 来指定#

#![cfg(feature="my-flag")] // Applies to the whole file

use crate::access_control::{func1, func2};
use crate::models;

#[derive(Debug)]
pub enum MyEnum {}
  
#[derive(Clone)]
pub struct MyStruct {}

pub fn my_func() {}
fn my_func_internal() {}
Run Code Online (Sandbox Code Playgroud)