【问题标题】:How do I access assets included in a Rust/Cargo project installed via `cargo install`?如何访问通过“cargo install”安装的 Rust/Cargo 项目中包含的资产?
【发布时间】:2018-02-05 00:28:40
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我可能会使用build script 和几个include 宏;我认为目前没有更好的选择。
  • 我正在尝试解决同样的问题。看起来像使用资源文件安装特定于平台的捆绑包可能是唯一的方法。我看过 cargo-bundle 但还没有真正为我工作。

标签: rust rust-cargo


【解决方案1】:

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


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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-03-06
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 2015-05-22
      • 2015-02-24
      • 1970-01-01
      • 2019-09-10
      • 2022-09-25
      相关资源
      最近更新 更多