我正在使用一个为我生成大量代码的库,它通常非常渴望生成我还没有使用的方法.在构建我的项目时,这会导致一系列嘈杂的警告.

该脚本生成了简单的旧脚本.rs文件贯穿我的代码库,然后导入并调用,与普通代码非常相似:

mod autogen_code; 
pub use self::autogen_code::*;

我不能在生成的代码中使用#![allow(unused_whatever)],因为当我重建项目时,生成脚本会再次运行,任何更改都会消失.这些文件是.gitignore'd,顶部有大 comments 说"这都是自动生成的.不要touch ."

我不想在我的整个项目中使用未使用的东西,所以在我的 crate 顶部放置#![allow(unused_whatever)]也不是第一步.

好的是,生成的文件都有一个可预测的名称,所以我希望有一种方法可以告诉cargo/rustc不要对匹配特定文件名的文件发出警告.这可能吗?

推荐答案

不,不能使用文件名模式应用lints.

相反,你可以...

  • 不要在文件中使用!#[allow(...)] inside,而是在mod声明中使用#[allow(...)]:

      #[allow(dead_code)]
      mod autogen;
    
  • 修改生成步骤以更改文件.例如,不要运行library-generator foo.input,而是运行library-generator foo.input && sed -i '' '1s/^/#![allow(whatever)]/' myfile.rs.您也可以在纯 rust 中进行此操作.由于"生成的文件都有一个可预测的名称",您也可以通过这种方式找到所有文件并执行此转换.现在,每次重新生成文件时都会应用转换.

  • 修改生成器本身,添加一个选项,以限制输出的函数或添加allow设置.如果你遇到了这个问题,其他人可能也会遇到.也许可以 for each 人解决这个问题.

  • 在某些情况下,您可以创建一个"垫片"模块,该模块执行您需要执行的任何操作,然后输入真正的代码.但这有点恶心:

      #![allow(...)]
    
      include!("autogen_real.rs");
    

Rust相关问答推荐

as操作符如何将enum转换为int?

如何在rust中有条件地分配变量?

trait声明中的生命周期参数

我如何在Rust中使用传递依赖中的特征?

带扫描的铁 rust 使用滤镜

具有对同一类型的另一个实例的可变引用的

为什么std repeat trait绑定在impl块和关联函数之间?

允许 rust 迹 struct 条目具有多种类型

Rust将String上的迭代器转换为&;[&;str]

为什么实现特征的对象期望比具体对象有更长的生命周期?

是否可以在不直接重复的情况下为许多特定类型实现一个函数?

通过写入 std::io::stdout() 输出不可见

如何在 Rust 中将函数项变成函数指针

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

Rust并发读写引起的死锁问题

如何从 x86_64 Mac 构建 M1 Mac?

打印 `format_args!` 时borrow 时临时值丢失

为什么在 rust 中删除 vec 之前应该删除元素

如何构建包含本地依赖项的 docker 镜像?

在 Rust 中有条件地导入?