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

问题描述 投票:0回答:1

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

#![plugin(myplugin)]

您还需要编辑

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

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

但是,如果你想分析大项目,这些修改似乎很麻烦,我想知道

cargo build
rustc
是否提供了任何方法来加载我的插件而不修改源代码。

rust rust-cargo rust-compiler-plugin
1个回答
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直接加载到编译器的插件注册表中(仅适用于主项目,不适用于项目的依赖项)。 您可以在 GitHub 上查看代码(在 MPLv2 下许可)。这种方法的优点是您不必提供插件的路径,因为插件是在前端构建的。这使得该插件的用户使用起来非常方便。缺点是这样的程序依赖于不稳定的编译器内部。这意味着您的程序可能会由于
rustc
不稳定 API 的重大更改而随时停止编译。

© www.soinside.com 2019 - 2024. All rights reserved.