Как я могу получить доступ к активам, включенным в проект Rust/Cargo, установленный через `load install`?
У меня есть проект, который включает некоторые связанные активы (сценарии Lua), которые мне нужно найти во время выполнения. Это может означать две вещи:
- Во время разработки (например,
cargo run
) я хочу найти его относительно источника
- При установке через
cargo install
, активы должны быть установлены где-то также, а установленная версия исполняемого файла должна найти установленные активы.
Я знаю о возможности использовать что-то вроде include_str!()
для компиляции текстовых файлов в двоичный файл, но я не хочу этого делать в этом случае.
Насколько я могу судить, cargo install
не имеет поддержки для установки чего-либо, кроме исполняемого файла на данный момент, которая является первой проблемой, хотя я не возражаю, чтобы установить обертку script, чтобы помочь.
Ответы
Ответ 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 поддержит его, но это все еще хорошее решение, пока мы ждем.