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

23
我有一个项目,其中包含一些相关的资产(Lua脚本),需要在运行时找到它们。这可能意味着两件事:
- 在开发期间(例如),我希望相对于源代码找到它们 - 通过安装后,资产也应该被安装在某个地方,并且可执行文件的安装版本应该找到已安装的资产。
我知道可以使用之类的选项将文本文件编译到二进制文件中,但在这种情况下,我不想那样做。
据我所知, 目前没有安装任何除可执行文件以外的内容的支持,这是第一个问题,尽管我不介意有一个包装器安装脚本来帮助。

我可能会选择一个构建脚本和一些include宏;我认为目前没有更好的选择。 - ljedrz
我正在尝试解决同样的问题。看起来安装一个带有资源文件的特定平台捆绑包可能是唯一的方法。我已经看过cargo-bundle,但还没有真正为我工作。 - Andrew Mackenzie
2个回答

5
根据您想要的结构,您可以尝试混合使用env::current_dir来获取当前目录,如果找不到任何内容,可以尝试使用可执行路径并从那里加载文件。您可以使用 env::current_exe 获取它。
我看到了困难,即cargo install将二进制文件复制到.cargo/bin中,这意味着其他资源仍然位于源文件夹中,位于.cargo/registry/src/...
在这种情况下,我同意@ljedrz的观点,include!似乎是唯一的方法。

2

在我的私人项目中,我不得不用include_bytes!替换“open,seek,read”,因为正如你所写的,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! version

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

虽然我更喜欢普通的阅读器,但在Rust支持之前,这仍然是一个不错的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接