首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成后将文件复制到目标目录。

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

Stack Overflow用户
提问于 2015-06-26 19:27:23
回答 2查看 12.2K关注 0票数 22

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

代码语言:javascript
运行
复制
/src
/resources
Cargo.toml

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

我知道使用自定义构建脚本可以做到这一点,但这似乎是一个值得特别对待的常见情况。所以问题是:提供了一种将文件复制到目标目录的标准方法(只使用)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-26 20:31:31

不,不是的。

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

如果您认为这是一个重要的特性,您可以在Cargo 问题跟踪器中打开一个特性请求。

或者,您可以编写makefile或shell脚本,该脚本将所有参数转发给cargo,然后手动复制目录:

代码语言:javascript
运行
复制
#!/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

现在你可以像

代码语言:javascript
运行
复制
% ./make.sh build
票数 13
EN

Stack Overflow用户

发布于 2021-05-13 08:55:37

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

代码语言:javascript
运行
复制
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);
}

这是个烂摊子,我对锈病很陌生。欢迎改进。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31080757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档