我应该如何使用 `rustc` crate?

5

我正在尝试在我的程序中使用rustc的crate。

#[macro_use]
extern crate rustc;
extern crate rustc_typeck;
extern crate syntax;
extern crate syntax_pos;

use rustc::hir;

fn main() {
    println!("Hello, World!");

}

我还在 Cargo.toml 文件中添加了一个额外的依赖项:

[dependencies]
log = "0.4.1"

cargo run 告诉您它只适用于私有和夜间版本,产生了一堆错误:

error: use of unstable library feature 'rustc_private': this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via `Cargo.toml` instead? (see issue #27812)
 --> src/main.rs:2:1
  |
2 | extern crate rustc;
  | ^^^^^^^^^^^^^^^^^^^

似乎Cargo想要从crates.io获取一个稳定的crate,但我不知道应该使用哪个crate。在crates.io上没有名为rustc的crate。
这是我的Rust安装版本:
rustc 1.23.0 (766bd11c8 2018-01-01) cargo 0.24.0 (45043115c 2017-12-05)
我使用rustup进行了安装。
如何为我的程序使用rustc crate?
我尝试将rustc = "1.23.0"添加到Cargo.toml中,但仍然无法正常工作,出现以下错误:
error: no matching package named `rustc` found (required by `rust-swift-serde-gen`)

这不是要求您在Cargo.toml中声明rustc吗? - tadman
@tadman 我不确定。我该怎么做?你能发一个答案吗?我在 crates.io 上找不到 rustc crate 的页面。 - eonil
我是指将其添加到 Cargo.toml 中,以拉取该依赖项,而不是使用 Rust 附带的私有依赖项。只需添加那一行并尝试它! - tadman
@tadman 它不行。错误: 找不到匹配的名为 \rustc` 的包(由 `rust-swift-serde-gen` 要求)`... 太遗憾了。 - eonil
1
@tadman 好的,我会去查看一下。 - eonil
显示剩余2条评论
2个回答

9

rustc并没有在crates.io上发布。

由于rustc crate的API不稳定,您必须切换到夜间编译器并通过在crate根目录(main.rslib.rs)开头添加以下行来选择:

#![feature(rustc_private)]

由于API不稳定,每次更新您的夜间编译器时,可能会出现意外情况!


1
啊...听起来rustc crate 永远不会稳定下来了。 - eonil
1
绝对正确!不过这似乎是一个 XY 问题:你想要使用 rustc 做什么?鉴于依赖 rustc 本身作为库永远不会稳定,可能有一种稳定的方法可以实现。 - daboross
@daboross 我想从Rust源代码中提取DTO(可序列化对象)模式,并为另一种语言(例如Swift)制作代码生成器。如果此代码仅适用于最新的稳定Rust编译器,则可以,但是对于日常使用而言,依赖于夜间版本似乎有些过度...我认为这里缺少了一些关键环节... - eonil
似乎我需要制作的是编译器插件而不是独立程序。 - eonil
啊,太酷了!可能需要更多的工作,但我建议创建一个库,用于构建脚本和使用syn crate解析源代码。如果您愿意创建一个源代码解析插件并链接它,我认为这值得在SO上提出一个问题。 - daboross
显示剩余2条评论

1
方法一:使用 rustc-dev 组件。
rustup component add rustc-dev

然后您可以使用:

#![feature(rustc_private)]
extern crate rustc_ast;

方法二:使用rustc-ap-rustc_* crates

根据rustc-auto-publish存储库:

crate rustc-ap-rustc_ast与Rust源代码中的rustc_ast相同。

racerrust-analyzer使用rustc-ap-rustc_* crates。

这是来自racer的Cargo.toml文件的一些代码:

[dependencies.rustc_errors]
package = "rustc-ap-rustc_errors"
version = "712.0.0"

[dependencies.rustc_parse]
package = "rustc-ap-rustc_parse"
version = "712.0.0"

[dependencies.rustc_session]
package = "rustc-ap-rustc_session"
version = "712.0.0"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接