如何访问通过`cargo install`安装的Rust / Cargo项目中包含的资产?

时间:2016-10-06 05:57:30

标签: rust rust-cargo

我有一个包含一些相关资产(Lua脚本)的项目,我需要在运行时找到它。这可能意味着两件事:

  • 在开发过程中(例如cargo run),我想找到它相对于源
  • 通过cargo install安装时,资产也应安装在某处,并且已安装的可执行文件版本应找到已安装的资产。

我知道使用include_str!()之类的东西将文本文件编译成二进制文件的选项,但在这种情况下我不想这样做。

据我所知,cargo install doesn't have any support for installing anything other than the executable at the moment,这是第一个问题,但我不介意有一个包装器安装脚本来帮助。

2 个答案:

答案 0 :(得分:3)

根据您希望它的结构,您可以尝试混合使用env::current_dir来获取当前目录,如果找不到任何内容,您可以尝试使用可执行路径并从那里加载内容。你可以通过env::current_exe得到它。

我看到了难度,即cargo install 将二进制文件复制到.cargo/bin,这意味着其他资源会保留在位于.cargo/registry/src/...的源文件夹中

在这种情况下,我agree with @ljedrz include!似乎是唯一的方法。

答案 1 :(得分:0)

在我的私人项目中,我必须用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支持它时我会更改它,但在我们等待的时候它仍然是一个很好的解决方案。