20

次のディレクトリ構造を持つゲームがあるとします。

/src
/resources
Cargo.toml

cargo buildディレクトリ内のファイルをコピーしresourcesて、実行ファイルと同じディレクトリに貼り付けたいと思います。

カスタム ビルド スクリプトを使用してこれを実行できることはわかっていますが、これは特別な扱いに値する一般的なケースのようです。質問は: cargo はファイルをターゲットディレクトリにコピーする標準的な方法を提供しますCargo.tomlか?

4

2 に答える 2

12

いいえ、そうではありません。

ビルド スクリプトを使用してファイルを移動できますが、これらは環境を準備することだけが目的であるため (たとえば、C ライブラリと shim をコンパイルします)、クレートがビルドされる前に実行されます。

これが重要な機能だと思われる場合は、Cargo issue trackerで機能リクエストを開くことができます。

または、すべての引数を 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
于 2015-06-26T20:31:31.770 に答える
4

(受け入れられた回答が言うように)クレートについてこれを解決することはできませんが、ファイルを正しく実行する必要がある「単一の」バイナリの場合、これはうまくいきます。

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に非常に慣れていません。改善歓迎。

于 2021-05-13T08:55:37.740 に答える