【问题标题】:How to load Rust compiler plugins without modifying the source code?如何在不修改源代码的情况下加载 Rust 编译器插件?
【发布时间】:2017-03-04 23:03:32
【问题描述】:

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

#![plugin(myplugin)]

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

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

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

【问题讨论】:

    标签: rust rust-cargo


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,太好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2012-10-09
    • 2011-09-06
    • 2017-02-04
    • 2018-08-23
    相关资源
    最近更新 更多