#cargo #tool #root-directory #debugging #target-directory

omnicopy_to_output

通用构建后复制,用于将文件放置在输出目录中

4 个版本 (2 个破坏性更改)

0.3.0 2024 年 8 月 4 日
0.2.0 2024 年 5 月 29 日
0.1.1 2024 年 1 月 14 日
0.1.0 2023 年 12 月 20 日

#824 in 文件系统

Download history 375/week @ 2024-05-13 275/week @ 2024-05-20 442/week @ 2024-05-27 213/week @ 2024-06-03 202/week @ 2024-06-10 222/week @ 2024-06-17 289/week @ 2024-06-24 252/week @ 2024-07-01 207/week @ 2024-07-08 145/week @ 2024-07-15 133/week @ 2024-07-22 210/week @ 2024-07-29 246/week @ 2024-08-05 167/week @ 2024-08-12

每月 768 次下载

MIT/Apache

14KB
61

Omnicopy_to_output

提供了一种通用的“构建后复制”操作实现,在撰写本文时,Rust 中对该操作的支持并不完善。此 crate 受 https://github.com/prenwyn/copy_to_output 的启发,但实现了更多管理辅助工具并解决了一些缺失的场景(再次,在撰写本文时)。

如果还有缺失的场景,请贡献力量!

请参阅 docs.rs 获取详细信息。

许可证

该项目受以下任一许可证的许可:

任选其一。

此项目的 SPDX 许可证标识符为 MIT OR Apache-2.0


lib.rs:

githubcrates-iodocs-rs


提供了一种通用的“构建后复制”操作实现,在撰写本文时,Rust 中对该操作的支持并不完善。此 crate 受 https://github.com/prenwyn/copy_to_output 的启发,但实现了更多管理辅助工具并解决了一些缺失的场景(再次,在撰写本文时)。

正如其名,目标是提供对所有可能的构建场景的覆盖,作为(如果有的话)Rust 工具中的本地解决方案的替代品。如果有什么缺失,请贡献力量!

示例

  • build.rs 中使用,带有自动发现。

    路径相对于项目根目录。如果您的资源位于项目中,Cargo 将自动检测更改并按需使缓存无效。

    use omnicopy_to_output::copy_to_output;
    
    fn main() {
        // Copy everything recursively from the res folder and place into output.
        copy_to_output("res").expect("Could not copy");
    }
    
  • 在具有自定义目标(例如,如果您的调试有不同的共享库)的 build.rs 中使用。

    注意,如果您同时使用了它们,构建将失败。每个目标目录仅在该构建运行时存在。完整的示例将包含条件逻辑。

    use omnicopy_to_output::copy_to_output_for_profile;
    
    fn main() {
        // Manually specify the profile (i.e. env:PROFILE)
        copy_to_output_for_profile("res/foo.dll", "release").expect("Could not copy");
        copy_to_output_for_profile("res/food.dll", "debug").expect("Could not copy");
        
    }
    
  • 使外部资源的缓存无效

    大型资源可能不在您的项目中。我们仍然可以将这些资源复制到输出,但 cargo 不会检测更改并使缓存无效。发出 cargo:rerun-if-changed 指令将通知 cargo 这些文件存在,但会将缓存无效化更改为 您指定的内容。注意,一旦您在一个地方这样做,默认的“包中的任何内容”规则就不再适用。但这通常是您理想配置的内容。

    use omnicopy_to_output::{copy_to_output, cargo_rerun_if_changed};
    
    fn main() {
        let path_to_large_resources = "/path/to/large/resources";
        cargo_rerun_if_changed(path_to_large_resources);
        copy_to_output(path_to_large_resources).expect("Could not copy");
    }
    
    

场景覆盖率

原始分叉的主要动机是支持工作区以及 cargo 缓存指令的托管体验。

我们支持以下内容: - 构建类型(例如,零售与测试;集成测试请参阅文件) - cargo::CompileKind - 目标 - 交叉编译(特殊情况目标) - 工作区或单个 crate 构建

注意事项

这是在没有来自 cargo 的更好解决方案的情况下。特别是,值得注意的是,构建脚本不应修改 OUT_DIR 目录之外的所有文件。我们不会修改,但这仍然不是指令的“精神”。

它的工作原理

为了定位目标目录,我们必须知道项目根目录和目标。

  1. 确定输出目录是否被覆盖,使用 env:CARGO_TARGET_DIR
    • 如果是,则直接使用该路径
    • 如果不是,则路径默认为 {workspace_root}/target,我们使用 project_root 确定。
  2. 确定使用哪个 CompileKind。Cargo 不会直接暴露这个。这个 crate 旨在在构建脚本中使用。Cargo 为构建脚本提供了 env:OUT_DIR。这不是我们想要放置这些资产的地方,但它确实允许我们推断 CompileKind。如果 triple + profile({target}/{profile})出现在路径中,则使用了 CompileKind::Target。否则,使用了 CompileKind::Host。配置文件来自 env:Profile,目标来自 build_target::target_triple
    • 对于 CompileKind::Host,我们将 /{profile} 连接起来
    • 对于 CompileKind::Target,我们将以下内容连接起来:/{target}/{profile}

依赖关系

~255KB