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

问题描述 投票:13回答:2

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

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

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

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

rust rust-cargo
2个回答
3
投票

根据你想要它的结构,你可以尝试混合env::current_dir来获取当前目录,如果没有找到任何东西你可以尝试使用可执行路径并从那里加载东西。你可以通过env::current_exe得到它。


我看到了困难,即cargo install只将二进制文件复制到.cargo/bin,这意味着额外的资源保留在位于.cargo/registry/src/...的源文件夹中。

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


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支持它时我会改变它,但在我们等待时它仍然是一个很好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.