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

谁都会走 提交于 2021-02-11 14:37:50

问题


I'm trying to list the source files of a Rust project using the cargo crate. I can not just simply list all the .rs files present in a directory as I want to retrieve exactly the files that the compiler sees during the compilation, which may not be all the .rs files.

I'm conducting my experiments on the the Alacritty repository, which has a cargo workspace of 3 projects. Here is my code so far:

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());
  }
}

Here is the output:

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

The members of the workspace are correctly found but I fail to retrieve the source files for each of these members. What am I missing?


回答1:


Your code works!

If you run 'cargo vendor' in the alacritty tree, this should solve your issue. Study the 'cargo vendor' command Also, study the --offline switch for the cargo build command. I did not need to use this, but it is very helpful reading.

Basically, cargo vendor pulls in all the source.

I am not sure exactly why your code is not working. I had difficulty recreating this using the /tmp directory. I then used a normal directory combined with a call to 'cargo vendor', and it worked. Before cutting and pasting my code below, be sure to change '/Users/[username]' with your own path to your home directory.

Here is my procedure:

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

This next part is probably not necessary:

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

Create a file at /Users/[username]/alacritty/.cargo/config and, insert the following:

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

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

Continuation of necessary part:

Modify the path statement to point to the newly created alacritty path:

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

Now, run your code

    cargo run

Here is my output:

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



回答2:


Search for each element of the needle in the haystack in order. Each time you find a matching element, only continue the search in the remaining portion of the haystack. You can express this nicely by taking a new subslice of of the haystack each time you match an element.



来源:https://stackoverflow.com/questions/60989162/how-to-list-a-projects-source-files-using-the-cargo-crate

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!