构建完成后复制文件到目标目录
Copy files to the target directory after build
假设我的游戏具有以下目录结构:
/src
/resources
Cargo.toml
我想cargo build
复制resources
目录下的文件,粘贴到与可执行文件相同的目录下
我知道可以使用自定义构建脚本来执行此操作,但这似乎是一个值得特殊处理的常见情况。所以问题是:cargo 是否提供将文件复制到目标目录的标准方法(仅使用 Cargo.toml
)?
不,不是。
您可以使用 build scripts 移动文件,但这些是 运行 在您构建 crate 之前,因为它们的唯一目的是准备环境(例如编译 C 库和垫片)。
如果您认为这是一个重要的功能,您可以在 Cargo 中打开一个功能请求 issue tracker。
或者,您可以编写一个 makefile 或 shell 脚本,将所有参数转发给 cargo,然后手动复制目录:
#!/bin/bash
DIR="$(dirname "[=10=]")"
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
现在您可以运行 cargo like
% ./make.sh build
我无法为板条箱解决这个问题(正如公认的答案所说),但对于需要文件 运行 正确的“单个”二进制文件,这对我有用。
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);
}
这是一团糟,我对 Rust 还很陌生。欢迎改进。
假设我的游戏具有以下目录结构:
/src
/resources
Cargo.toml
我想cargo build
复制resources
目录下的文件,粘贴到与可执行文件相同的目录下
我知道可以使用自定义构建脚本来执行此操作,但这似乎是一个值得特殊处理的常见情况。所以问题是:cargo 是否提供将文件复制到目标目录的标准方法(仅使用 Cargo.toml
)?
不,不是。
您可以使用 build scripts 移动文件,但这些是 运行 在您构建 crate 之前,因为它们的唯一目的是准备环境(例如编译 C 库和垫片)。
如果您认为这是一个重要的功能,您可以在 Cargo 中打开一个功能请求 issue tracker。
或者,您可以编写一个 makefile 或 shell 脚本,将所有参数转发给 cargo,然后手动复制目录:
#!/bin/bash
DIR="$(dirname "[=10=]")"
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
现在您可以运行 cargo like
% ./make.sh build
我无法为板条箱解决这个问题(正如公认的答案所说),但对于需要文件 运行 正确的“单个”二进制文件,这对我有用。
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);
}
这是一团糟,我对 Rust 还很陌生。欢迎改进。