【问题标题】:How to include a text file along with a crate installation [duplicate]如何在板条箱安装中包含文本文件[重复]
【发布时间】:2019-12-18 07:10:25
【问题描述】:

我的程序在我的本地机器上按预期工作。它以 Emacs “Spook” 游戏 (M-x spook) 的方式从文本文件中打印随机行。文本文件位于src/spook.lines

C:\Users\datan>spooks
domestic Eiffel Tower Euzkadi Ta Askatasuna Euzkadi Ta Askatasuna minefield
C:\Users\datan>spooks
Uzi White House secret Sivi Vukovi divers
C:\Users\datan>spooks
Hizb-i-Islami smallpox US Airways SWAT plague
C:\Users\datan>

但如果我publish it as a crate 并安装它,则找不到文本文件(因为如果程序是从 crates.io 安装的,它不在src/spook.lines 中):

C:\Users\datan>docker run -it rust bash
Unable to find image 'rust:latest' locally
latest: Pulling from library/rust
16ea0e8c8879: Pull complete
50024b0106d5: Pull complete
ff95660c6937: Pull complete
9c7d0e5c0bc2: Pull complete
29c4fb388fdf: Pull complete
ee0ab7fd0ac4: Pull complete
Digest: sha256:d8e2b124d6f4fcdf977bf7e6cfbda87fa5061b0c1933742699ee5131444217c9
Status: Downloaded newer image for rust:latest
root@137111b4d94c:/# cargo install spooks
    Updating crates.io index
  Downloaded spooks v0.1.0
  Downloaded 1 crate (19.0 KB) in 1.60s
  Installing spooks v0.1.0
  Downloaded getopts v0.2.21
  Downloaded rand v0.7.2
  Downloaded rand_chacha v0.2.1
  Downloaded easy_reader v0.5.0
  Downloaded getrandom v0.1.13
  Downloaded rand_core v0.5.1
  Downloaded unicode-width v0.1.7
  Downloaded libc v0.2.66
  Downloaded c2-chacha v0.2.3
  Downloaded fnv v1.0.6
  Downloaded cfg-if v0.1.10
  Downloaded ppv-lite86 v0.2.6
   Compiling libc v0.2.66
   Compiling getrandom v0.1.13
   Compiling cfg-if v0.1.10
   Compiling ppv-lite86 v0.2.6
   Compiling fnv v1.0.6
   Compiling unicode-width v0.1.7
   Compiling getopts v0.2.21
   Compiling c2-chacha v0.2.3
   Compiling rand_core v0.5.1
   Compiling rand_chacha v0.2.1
   Compiling rand v0.7.2
   Compiling easy_reader v0.5.0
   Compiling spooks v0.1.0
    Finished release [optimized] target(s) in 22.15s
  Installing /usr/local/cargo/bin/spooks
   Installed package `spooks v0.1.0` (executable `spooks`)
root@137111b4d94c:/# spooks
(no output because src/spook.lines is not there)

我包含文件的方式是:

let file = File::open("src/spook.lines")?;

为什么我不能只告诉货物/板条箱包装包含文本文件?首选方式是什么?我的意思是即使我将文件包含在某个目录中,它也不会出现在执行的PATH 中,因为程序可能从任何地方运行。

【问题讨论】:

  • 一种可能的解决方法是include!它。
  • @Inline 是的,我开始尝试了,但是我使用的 easy_reader crate 需要一个文件对象而不是字符串,所以这意味着在本地目录中创建一个“虚拟”文件并且可能有每次程序运行时清理和删除它(?)
  • 根据its documentationeasy_rider只需要Read + Seek,所以你可以include!你的文字并使用Cursor来访问它。另见:stackoverflow.com/a/32675033/5397009
  • 嗨!我认为您的问题与this one 基本相同。虽然我链接的那个没有令人满意的答案(还),但您是否同意我们应该关闭您的作为我链接的副本的副本?
  • @LukasKalbertodt 你的这个答案似乎是解决方案stackoverflow.com/a/41069910/108207

标签: rust rust-cargo rust-crates platform-independence


【解决方案1】:

您可以使用include_str! 宏。

fn main() {
    let my_str = include_str!("spanish.in");
    assert_eq!(my_str, "adiós\n");
    print!("{}", my_str);
}

https://doc.rust-lang.org/std/macro.include_str.html

【讨论】:

  • 这不是答案。这只是一种解决方法。
  • 您好!您的回答应该解释如何解决 cmets 中出现的easy_reader 问题。但如果我们结束这个问题以支持this one,我会更喜欢。那里已经提到了include_str
猜你喜欢
  • 2019-04-26
  • 2013-04-06
  • 2022-11-07
  • 2018-05-18
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
相关资源
最近更新 更多