- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的包有一个使用 include_bytes!(…)
的二进制目标将一些预先计算的值的副本捆绑到编译的二进制文件中。这是一种优化,但并非绝对必要:如果捆绑数据切片 .is_empty()
,程序能够在运行时计算这些值。 .
程序需要能够在没有这些数据的情况下构建。但是,如果目标文件不存在,include_bytes!("data/computed.bin")
会导致生成错误。
error: couldn't read src/data/computed.bin: No such file or directory (os error 2)
目前,我有一个 Bash 构建脚本,它使用 touch data/computed.bin
来确保文件在构建之前存在。但是,我不想依赖特定于平台的解决方案,例如 Bash;我希望能够使用 cargo build
在任何支持的平台上构建这个项目。
如果文件退出,我的 Rust 程序如何 include_bytes!(...)
或 include_str!(...)
优雅地回退到替代值或行为如果文件不存在,而只使用标准的 Cargo 构建工具?
最佳答案
我们可以使用 build script确保包含的文件在 out 包尝试包含它之前存在。但是,构建脚本只能写入当前构建的唯一输出目录,所以我们不能直接在源目录中创建缺少的输入文件。
error: failed to verify package tarball
Caused by:
Source directory was modified bybuild.rs
duringcargo publish
. Build scripts should not modify anything outside ofOUT_DIR
.
相反,我们的构建脚本可以在构建目录中创建要包含的文件,复制源数据(如果存在),并且我们可以更新我们的包代码以从构建目录而不是源目录中包含此数据.构建路径将在构建期间在 OUT_DIR
环境变量中可用,因此我们可以在构建中从 std::env::var("OUT_DIR")
访问它脚本和来自 env!("OUT_DIR")
在我们包的其余部分。
//! build.rs
use std::{fs, io};
fn main() {
let out_dir = std::env::var("OUT_DIR").unwrap();
fs::create_dir_all(&format!("{}/src/data", out_dir))
.expect("unable to create data directory");
let path = format!("src/data/computed.bin", name);
let out_path = format!("{}/{}", out_dir, path);
let mut out_file = fs::OpenOptions::new()
.append(true)
.create(true)
.open(&out_path)
.expect("unable to open/create data file");
if let Ok(mut source_file) = fs::File::open(&path) {
io::copy(&mut source_file, &mut out_file).expect("failed to copy data after opening");
}
}
//! src/foo.rs
fn precomputed_data() -> Option<&'static [u8]> {
let data = include_bytes!(concat!(env!("OUT_DIR"), "/src/data/computed.bin")).as_ref();
if !data.is_empty() {
Some(data)
} else {
None
}
}
关于rust - 如果缺少 include_bytes!(…) 目标,则回退到替代值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56014764/
我想在我的项目中嵌入一个图像文件。更准确地说,我想嵌入包含图像的已加载 Rust 对象,在我的例子中是 usvg::Tree。 , 或更高级的 cairo::ImageSurface .那可能吗?我只
include_bytes!和 include_str!宏对我来说似乎是一个谜。我知道该文件包含在二进制文件中,但它在运行时如何工作? 文件何时加载到内存中? 是否有任何理由不将 include_by
我的包有一个使用 include_bytes!(…) 的二进制目标将一些预先计算的值的副本捆绑到编译的二进制文件中。这是一种优化,但并非绝对必要:如果捆绑数据切片 .is_empty(),程序能够在运
我正在尝试在 Iron 应用程序中使用 include_bytes! 发送包含在二进制文件中的文件。我想为我的应用程序提供一个文件,它只需要很少的 HTML、CSS 和 JS 文件。这是我正在摆弄的一
我正在使用 include_bytes! 宏将 GLSL 着色器编译成 Rust 程序。然而,Cargo 似乎并没有意识到这一点:当我仅修改着色器文件并使用 cargo run 对其进行测试时,更新的
我是一名优秀的程序员,十分优秀!