gpt4 book ai didi

rust - 如果缺少 include_bytes!(…) 目标,则回退到替代值

转载 作者:行者123 更新时间:2023-11-29 07:59:19 25 4
gpt4 key购买 nike

我的包有一个使用 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 by build.rs during cargo publish. Build scripts should not modify anything outside of OUT_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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com