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

如何访问通过“Cargo install”安装的Rust/Cargo项目中包含的资产?,rust,rust-cargo,Rust,Rust Cargo,我有一个项目,其中包括一些相关资产(Lua脚本),我需要在运行时找到这些资产。这可能意味着两件事: 在开发过程中(例如,cargo run),我希望找到它相对于源的位置 通过cargo install安装时,资产也应安装在某个位置,安装的可执行文件版本应能找到已安装的资产 我知道可以使用include\u str!()将文本文件编译成二进制文件,但在这种情况下我不想这样做 据我所知,cargo install,这是第一个问题,尽管我不介意有一个包装器安装脚本来提供帮助。根据您希望它的结构,您

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

  • 在开发过程中(例如,
    cargo run
    ),我希望找到它相对于源的位置
  • 通过
    cargo install
    安装时,资产也应安装在某个位置,安装的可执行文件版本应能找到已安装的资产
我知道可以使用
include\u str!()
将文本文件编译成二进制文件,但在这种情况下我不想这样做


据我所知,
cargo install
,这是第一个问题,尽管我不介意有一个包装器安装脚本来提供帮助。

根据您希望它的结构,您可以尝试混合使用来获取当前目录,如果没有找到任何内容,您可以尝试使用可执行路径并从那里加载内容。这是你的拿手好戏


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


在这种情况下,我认为这似乎是唯一的办法。

在我的私人项目中,我不得不用
包含字节来替换“打开、查找、读取”因为,正如您所写,
货物安装
不处理资产。下面是一个例子:

文件::打开
版本

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);
let vertices_bytes = include_bytes!("vertices.npy");
let mut reader = BufReader::new(&vertices_bytes[80..]);
包含\u字节版本

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);
let vertices_bytes = include_bytes!("vertices.npy");
let mut reader = BufReader::new(&vertices_bytes[80..]);

我仍然更喜欢普通的阅读器,我会在生锈的时候更换它,但在我们等待的时候它仍然是一个很好的解决方案。

我可能会使用一个和两个
include
宏;我认为目前没有更好的选择。我正试图解决同样的问题。看起来,使用资源文件安装特定于平台的捆绑包可能是唯一的方法。我已经看过了货包,但还没有真正为我工作。