Подтвердить что ты не робот

Как я могу получить доступ к активам, включенным в проект Rust/Cargo, установленный через `load install`?

У меня есть проект, который включает некоторые связанные активы (сценарии Lua), которые мне нужно найти во время выполнения. Это может означать две вещи:

  • Во время разработки (например, cargo run) я хочу найти его относительно источника
  • При установке через cargo install, активы должны быть установлены где-то также, а установленная версия исполняемого файла должна найти установленные активы.

Я знаю о возможности использовать что-то вроде include_str!() для компиляции текстовых файлов в двоичный файл, но я не хочу этого делать в этом случае.

Насколько я могу судить, cargo install не имеет поддержки для установки чего-либо, кроме исполняемого файла на данный момент, которая является первой проблемой, хотя я не возражаю, чтобы установить обертку script, чтобы помочь.

4b9b3361

Ответ 1

В зависимости от того, как вы хотите его структурировать, вы можете попробовать сочетание env::current_dir, чтобы получить текущий каталог, и если это не так Не находите ничего, что вы можете попробовать использовать исполняемый путь и загружать вещи оттуда. Вы получите это с помощью env::current_exe.


Я вижу трудность, заключающуюся в том, что cargo install копирует только двоичный код в .cargo/bin, что означает, что дополнительные ресурсы остаются в исходной папке, расположенной в .cargo/registry/src/....

В этом случае я согласен с @ljedrz, что include! кажется единственным способом.

Ответ 2

В моем приватном проекте мне пришлось заменить "open, seek, read" на include_bytes!, потому что, как вы писали, cargo install не обрабатывает активы. Вот пример:

File::open версия

let mut f = File::open("examples/vertices.npy")
    .expect("Can't read file 'examples/vertices.npy'");
f.seek(SeekFrom::Start(80)).unwrap();
let mut reader = BufReader::new(f);

include_bytes! версия

let vertices_bytes = include_bytes!("vertices.npy");
let mut reader = BufReader::new(&vertices_bytes[80..]);

Я по-прежнему предпочитаю нормальный читатель, и я его изменю, когда Rust поддержит его, но это все еще хорошее решение, пока мы ждем.