让我们假设我有一个具有以下目录结构的游戏:
/src
/resources
Cargo.toml
我希望cargo build
复制resources
目录中的文件,并将它们粘贴到与可执行文件相同的目录中。
我知道使用自定义构建脚本可以做到这一点,但这似乎是一个值得特别对待的常见情况。所以问题是:提供了一种将文件复制到目标目录的标准方法(只使用)。
发布于 2015-06-26 20:31:31
不,不是的。
您可以使用构建脚本来移动文件,但是这些文件是在构建机箱之前运行的,因为它们的唯一目的是准备环境(例如编译C库和shims)。
如果您认为这是一个重要的特性,您可以在Cargo 问题跟踪器中打开一个特性请求。
或者,您可以编写makefile或shell脚本,该脚本将所有参数转发给cargo,然后手动复制目录:
#!/bin/bash
DIR="$(dirname "$0")"
if cargo "$@"; then
[ -d "$DIR/target/debug" ] && cp -r "$DIR/resources" "$DIR/target/debug/resources"
[ -d "$DIR/target/release" ] && cp -r "$DIR/resources" "$DIR/target/release/resources"
fi
现在你可以像
% ./make.sh build
发布于 2021-05-13 08:55:37
对于板条箱,我不能解决这个问题(正如公认的答案所述),但是对于一个需要文件正确运行的“单一”二进制文件,这对我来说是有效的。
use std::env;
use std::path::Path;
use std::path::PathBuf;
fn main() {
println!("cargo:rerun-if-changed=config.json");
println!("cargo:warning=Hello from build.rs");
println!("cargo:warning=CWD is {:?}", env::current_dir().unwrap());
println!("cargo:warning=OUT_DIR is {:?}", env::var("OUT_DIR").unwrap());
println!("cargo:warning=CARGO_MANIFEST_DIR is {:?}", env::var("CARGO_MANIFEST_DIR").unwrap());
println!("cargo:warning=PROFILE is {:?}", env::var("PROFILE").unwrap());
let output_path = get_output_path();
println!("cargo:warning=Calculated build path: {}", output_path.to_str().unwrap());
let input_path = Path::new(&env::var("CARGO_MANIFEST_DIR").unwrap()).join("config.json");
let output_path = Path::new(&output_path).join("config.json");
let res = std::fs::copy(input_path, output_path);
println!("cargo:warning={:#?}",res)
}
fn get_output_path() -> PathBuf {
//<root or manifest path>/target/<profile>/
let manifest_dir_string = env::var("CARGO_MANIFEST_DIR").unwrap();
let build_type = env::var("PROFILE").unwrap();
let path = Path::new(&manifest_dir_string).join("target").join(build_type);
return PathBuf::from(path);
}
这是个烂摊子,我对锈病很陌生。欢迎改进。
https://stackoverflow.com/questions/31080757
复制相似问题