Как составить список исходных файлов проекта, используя автомобиль go ящик? - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь перечислить исходные файлы проекта Rust, используя car go crate . Я не могу просто перечислить все файлы .rs, присутствующие в каталоге, поскольку я хочу получить именно те файлы, которые компилятор видит во время компиляции, которые могут быть не всеми файлами .rs.

Я провожу свои эксперименты на хранилище Alacritty , которое имеет автомобиль go рабочее пространство из 3 проектов. Вот мой код:

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

Члены рабочей области найдены правильно, но мне не удается получить исходные файлы для каждого из них. члены. Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Ваш код работает!

Если вы запустите 'car go vendor' в дереве Alacritty, это должно решить вашу проблему. Изучите команду 'car go vendor' Также изучите ключ --offline для команды build go car. Мне не нужно было использовать это, но это очень полезно для чтения.

В основном, поставщик машины go тянет во все исходники.

Я не совсем уверен, почему ваш код не соответствует за работой. Мне было трудно воссоздать это, используя каталог / tmp. Затем я использовал обычный каталог в сочетании с вызовом 'car go vendor', и это сработало. Прежде чем вырезать и вставить мой код ниже, обязательно измените «/ Users / [username]» на свой собственный путь к домашней директории.

Вот моя процедура:

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

Это следующая часть, вероятно, не нужна:

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

Создайте файл в /Users/[username]/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
0 голосов
/ 02 апреля 2020

Поиск каждого элемента иголки в стоге сена по порядку. Каждый раз, когда вы найдете соответствующий элемент, продолжайте поиск только в оставшейся части стога сена. Вы можете express это прекрасно сделать, беря новый кусочек стога сена каждый раз, когда вы соответствуете элементу.

...