如何在不修改源代码的情况下加载Rust编译器插件?

时间:2017-03-04 04:58:52

标签: rust rust-cargo

Rust提供了各种编写插件的方法。为了扩展对Rust代码的检查,它允许开发人员编写Lint Plugins。使用插件的典型方法是在源代码中添加一行,指示使用此插件:

#![plugin(myplugin)]

您还需要编辑Cargo.toml文件以在dependencies部分中包含您的插件项目:

myplugin = {path = "/path/to/myproject"}

但是,如果你想分析大型项目,这些修改似乎令人不安,我想知道cargo buildrustc是否提供了加载我的插件而无需修改源代码的任何方法。

1 个答案:

答案 0 :(得分:3)

rustc有一个命令行参数,用于加载其他插件:-Z extra-plugins=<plugins>。但是,此选项还要求将已编译的插件库的路径传递给编译器。如果插件库在Cargo.toml中声明为依赖项,则会自动完成此操作。如果它不在Cargo.toml中,那么除了--extern my_plugin=/path/to/plugin.rlib选项之外,您可以单独编译它并使用-Z extra-plugins=<plugins>手动引用它。

还有另一种选择。 Clippy,Rust的一般常量lint的大集合,提供了可以作为cargo clippy调用的程序。该程序基本上充当假rustc,实现编译器前端(使用rustc使用的内部包),将Clippy直接加载到编译器的插件注册表中(仅适用于主项目,不是对于项目的依赖项)。 You can see the code on GitHub (licensed under MPLv2).这种方法的优点是你不必提供插件的路径,因为插件是在前端构建的。这使得插件的用户使用起来非常方便。缺点是这样的程序依赖于不稳定的编译器内部。这意味着由于rustc不稳定的API发生重大变化,您的程序可能会随时停止编译。