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

标签 rust rust-cargo

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

#![plugin(myplugin)]

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

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

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

最佳答案

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 不稳定。

关于rust - 如何在不修改源代码的情况下加载Rust编译器插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42592285/

相关文章:

rust - 如何在迭代器上调用计数并仍然使用迭代器的项目?

macos - OpenSSL crate 在 Mac OS X 10.11 上编译失败

vim - 使用 Rust-analyzer 处理单个文件 Rust

arrays - Rust 数组是否有等效于 JavaScript 的 indexOf ?

rust - 为什么 Rust 有 struct 和 enum?

rust - cargo .toml : how to conditionally enable a dependency feature?

emacs - 如何从 Emacs 运行 cargo

rust - 最终用户实用程序/应用程序应该在 crates.io 上注册吗?

rust - 位置无关代码 (PIC) 中的绝对地址

rust - 我怎样才能让 Serde 在反序列化期间从 arena 分配字符串?