生成后将文件复制到目标目录

aoc*_*via 9 rust rust-cargo

我们假设我有一个具有以下目录结构的游戏:

/src
/resources
Cargo.toml
Run Code Online (Sandbox Code Playgroud)

我想cargo build复制resources目录中的文件并将它们粘贴到与可执行文件相同的目录中.

我知道可以使用自定义构建脚本来执行此操作,但这似乎是一个值得特殊处理的常见情况.所以问题是:货物是否提供了将文件复制到目标目录的标准方法(仅使用Cargo.toml)?

Ada*_*ter 10

我无法解决板条箱的问题(正如公认的答案所说),但对于需要文件才能正确运行的“单个”二进制文件,这对我有用。

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);
}
Run Code Online (Sandbox Code Playgroud)

这真是一团糟,而且我对 Rust 还很陌生。欢迎改进。

  • 我认为你会受益于“OUT_DIR”:https://doc.rust-lang.org/cargo/reference/build-scripts.html#outputs-of-the-build-script (4认同)

Vla*_*eev 7

不,它没有.

您可以使用构建脚本移动文件,但这些文件在构建 crate之前运行,因为它们的唯一目的是准备环境(例如,编译C库和填充程序).

如果您认为这是一项重要功能,则可以在货物问题跟踪器中打开功能请求.

或者,您可以编写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
Run Code Online (Sandbox Code Playgroud)

现在你可以运行货物了

% ./make.sh build
Run Code Online (Sandbox Code Playgroud)

  • 我按你的建议打开了一个问题.如果有人有兴趣,请点击链接:https://github.com/rust-lang/cargo/issues/1759 (6认同)