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 文件系统
每月 768 次下载
14KB
61 行
Omnicopy_to_output
提供了一种通用的“构建后复制”操作实现,在撰写本文时,Rust 中对该操作的支持并不完善。此 crate 受 https://github.com/prenwyn/copy_to_output 的启发,但实现了更多管理辅助工具并解决了一些缺失的场景(再次,在撰写本文时)。
如果还有缺失的场景,请贡献力量!
请参阅 docs.rs 获取详细信息。
许可证
该项目受以下任一许可证的许可:
任选其一。
此项目的 SPDX 许可证标识符为 MIT OR Apache-2.0
。
lib.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 目录之外的所有文件。我们不会修改,但这仍然不是指令的“精神”。
它的工作原理
为了定位目标目录,我们必须知道项目根目录和目标。
- 确定输出目录是否被覆盖,使用
env:CARGO_TARGET_DIR
- 如果是,则直接使用该路径
- 如果不是,则路径默认为
{workspace_root}/target
,我们使用 project_root 确定。
- 确定使用哪个
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