#build-script #temp-dir #cargo-clean #cargo-build #temporary #directory #compile-time

build scratch

编译时临时目录,由多个crate共享,并由cargo clean删除。

8个稳定版本

使用旧的Rust 2015

1.0.7 2023年7月15日
1.0.6 2023年7月6日
1.0.5 2023年3月5日
1.0.3 2022年12月17日
1.0.0 2020年9月17日

构建实用工具中排名23

Download history 197862/week @ 2024-03-14 207995/week @ 2024-03-21 209320/week @ 2024-03-28 220955/week @ 2024-04-04 234483/week @ 2024-04-11 242407/week @ 2024-04-18 228795/week @ 2024-04-25 226307/week @ 2024-05-02 233897/week @ 2024-05-09 227436/week @ 2024-05-16 216376/week @ 2024-05-23 235311/week @ 2024-05-30 204686/week @ 2024-06-06 221193/week @ 2024-06-13 213755/week @ 2024-06-20 173800/week @ 2024-06-27

每月下载量853,989
301个crate中使用(直接使用6个)

MIT/Apache

11KB

构建脚本共享的临时目录

github crates.io docs.rs build status

此crate公开一个编译时临时目录,该目录可以在构建图中由多个crate共享,并由cargo clean删除。

预期使用方式是从build.rs Cargo构建脚本中,或者更有可能是从被其他crate构建脚本调用的库中。

# Cargo.toml

[build-dependencies]
scratch = "1.0"
// build.rs

fn main() {
    let dir = scratch::path("mycrate");
    // ... write or read inside of that path
}

比较

std::env::var_os("OUT_DIR") 的比较

  • 此功能与OUT_DIR的不同之处在于,所有通过匹配的 suffix 参数进行构建的crate都将看到相同的目录路径,并且每个crate都可以看到其他crate的构建脚本已经放入该目录的内容。

  • 此功能与OUT_DIR相似之处在于,两者在执行 cargo clean 时都会被删除。

std::env::temp_dir() 的比较

  • 此功能与temp_dir()相似之处在于,放入其中的内容对随后运行的构建脚本可见。

  • 此功能与temp_dir()的不同之处在于,cargo clean 会清理内容。


提示

当Cargo运行多个并发构建脚本且访问相同的临时目录时,您需要考虑会发生什么。在某些用例中,您可能需要对临时目录的内容进行一些同步,例如通过一个咨询性的文件锁。在类Unix和Windows主机系统上,按顺序排列构建脚本,以便每个脚本在下一个脚本访问之前都获得独占访问权限的最简单方法是

use std::fs::File;
use std::io;

fn main() -> io::Result<()> {
    let dir = scratch::path("demo");
    let flock = File::create(dir.join(".lock"))?;
    fs2::FileExt::lock_exclusive(&flock)?;

    // ... now do work
}

这种最简单的方法对于填充缓慢(可能是一个大下载)但使用快速/几乎立即的缓存来说是不错的。另一方面,如果使用您的缓存的构建脚本即使只从临时目录中读取也需要一段时间才能完成,那么允许读者并行进步的不同方法将表现得更好。

use std::fs::{self, File};
use std::io;

fn main() -> io::Result<()> {
    let dir = scratch::path("demo");
    let flock = File::create(dir.join(".lock"))?;
    let sdk = dir.join("thing.sdk");

    if !sdk.exists() {
        fs2::FileExt::lock_exclusive(&flock)?;
        if !sdk.exists() {
            let download_location = sdk.with_file_name("thing.sdk.partial");
            download_sdk_to(&download_location)?;
            fs::rename(&download_location, &sdk)?;
        }
        fs2::FileExt::unlock(&flock)?;
    }

    // ... now use the SDK
}

对于不仅仅是第一个构建脚本写入目录而其余脚本读取目录的情况,可以考虑更复杂的方案,这可能包括使用lock_shared


许可

根据您的选择,受Apache License, Version 2.0MIT许可的许可。
除非您明确声明,否则根据Apache-2.0许可定义的您有意提交以包含在此软件包中的任何贡献,将按照上述方式双重许可,不附加任何额外条款或条件。

无运行时依赖