如何使用 cargo crate 列出项目的源文件?

How to list a project's source files using the cargo crate?

我正在尝试使用 cargo crate 列出 Rust 项目的源文件。我不能简单地列出目录中存在的所有 .rs 文件,因为我想准确检索编译器在编译期间 看到 的文件,这可能不是全部.rs 个文件。

我正在对 3 个项目的 the Alacritty repository, which has a cargo workspace 进行实验。到目前为止,这是我的代码:

extern crate cargo;

use std::path::Path;
use cargo::core::Source;

fn main() {
  let path = Path::new("/tmp/alacritty/Cargo.toml");
  let config = cargo::util::config::Config::default().unwrap();

  let ws = cargo::core::Workspace::new(&path, &config).unwrap();

  for pkg in ws.members() {
    println!("found package {}", pkg);

    let config = ws.config();

    let mut src = cargo::sources::PathSource::new(pkg.root(), pkg.package_id().source_id(), config);
    src.update().unwrap();

    let src_files = src.list_files(pkg).unwrap();
    println!("found {} source files", src_files.len());
  }
}

这是输出:

found package alacritty v0.5.0-dev (/tmp/alacritty/alacritty)
found 0 source files
found package alacritty_terminal v0.5.0-dev (/tmp/alacritty/alacritty_terminal)
found 0 source files
found package font v0.1.0 (/tmp/alacritty/font)
found 0 source files

已正确找到工作区的成员,但我未能检索到每个成员的源文件。我错过了什么?

在大海捞针中按顺序搜索针的每个元素。每次找到匹配元素时,只在大海捞针的剩余部分继续搜索。每次匹配一个元素时,您都可以通过大海捞针的新子切片来很好地表达这一点。

您的代码有效!

如果您 运行 'cargo vendor' 在 alacritty 树中,这应该可以解决您的问题。研究 'cargo vendor' command 另外,研究 cargo build 命令的 --offline 开关。我不需要使用这个,但它对阅读很有帮助。

基本上货源都是货源拉进来的

我不确定您的代码为何无法正常工作。我很难使用 /tmp 目录重新创建它。然后,我使用了一个普通目录并结合了对 'cargo vendor' 的调用,并且成功了。在下面剪切和粘贴我的代码之前,请务必将“/Users/[用户名]”更改为您自己的主目录路径。

这是我的程序:

cd ~
git clone https://github.com/jwilm/alacritty
cargo vendor

下一部分可能没有必要:

mkdir /Users/[username]/alacritty/.cargo

在 /Users/[用户名]/alacritty/ 创建一个文件。cargo/config 并插入以下内容:

[source.crates-io]
replace-with = "vendored-sources"

[source.vendored-sources]
directory = "vendor"

必要部分续:

修改路径语句以指向新创建的 alacritty 路径:

    let path = Path::new("/Users/[username]/alacritty/Cargo.toml");

现在,运行 你的代码

    cargo run

这是我的输出:

cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.27s
     Running `target/debug/test3`
found package alacritty v0.5.0-dev (/Users/jmurray/alacritty/alacritty)
found 18 source files
found package alacritty_terminal v0.5.0-dev 
(/Users/[username]/alacritty/alacritty_terminal)
found 172 source files
found package font v0.1.0 (/Users/jmurray/alacritty/font)
found 12 source files