#build #build-script #file #makefile #compiler #generation #replace

build devbox-build

用于编写 build.rs 构建脚本的库

2 个版本

0.1.1 2020 年 12 月 25 日
0.1.0 2020 年 5 月 15 日

#443构建工具


devbox 中使用

MIT 许可证

46KB
689 行代码(不包括注释)

Crates.io MIT licensed

devbox-build

用于编写 Rust 构建脚本(build.rs)的小型实用库。

它包含了一组类型,可以使得编写构建脚本变得更加容易。它专注于文件操作和生成,同时检查文件时间戳以避免不必要的构建步骤。它可以在某些情况下替换 makefile,例如复制一些文件和调用某些外部编译器或工具(如 NPM)。

大多数方法不返回 Result,而是简单地使用一致的错误消息 panic,停止 Cargo 构建,这在大多数情况下是构建脚本的期望行为。对于您希望从错误中恢复或实现更好的错误报告的情况,大多数方法都有一个后缀为 '_result' 的双胞胎方法,该方法返回 Result 值。

通过伞形 devboxcrate 安装

[dev-dependencies]
devbox = { version = "0.1" }

示例

示例构建脚本在项目 root/webapp 中的目标目录内使用 NPM 构建 Web 应用程序,通过安装所有 JS 依赖项并运行 NPM 中的构建脚本。构建的 Web 应用程序随后通过将其打包为 Rust 源代码嵌入到 Rust 二进制文件中。所有步骤仅在干净的构建或相关资源自上次构建以来发生变化时执行。


pub fn main() {

    let build = Build::new();

    //-- Setup web app build dir inside of Rust target directory ----------------------

    // Rust does not allow changes outside target directory, so setup a webapp build
    // directory using links to source files where nodejs and company can do it's thing

    let webrs = build.out_dir().file("webapp.rs");
    let websrc = build.manifest_dir().dir("webapp");
    let webwrk = build.out_dir().dir("webapp_build");
    let webwrk_pkg = webwrk.file("package.json");
    let webwrk_pkl = webwrk.file("package-lock.json");
    let webwrk_ndm = webwrk.dir("node_modules");
    let webwrk_dst = webwrk.dir("dist");

    for unit in websrc.content("*") {
        unit.link_from_inside(&webwrk);
    }

    //-- Build webapp using NPM -------------------------------------------------------

    let npm = Cmd::new("npm").arg("--prefix").arg(webwrk.path());

    webwrk_ndm.mk_from("Install WebApp node packages", &webwrk_pkg + &webwrk_pkl, ||{
        npm.clone().arg("install").run();
        webwrk_ndm.touch();
    });

    webwrk_dst.mk_from("Build WebApp using webpack", &webwrk.content("**"), || {
        npm.clone().arg("run").arg("build").run();
        webwrk_dst.touch();
    });

    //-- Package webapp into server binary as Rust source code ------------------------

    webrs.mk_from("Embed WebApp build into binary", &webwrk_dst, || {
        let mappings = webwrk_dst.files("**").into_iter().map(|file|
            format!(r#""{}" => Some(include_bytes!("{}")),"#,
                file.path().strip_prefix(&webwrk_dst.path()).unwrap().to_str().unwrap(),
                file.path().to_str().unwrap())
        ).fold("".to_owned(), |result, ref s| result + s + "\n" );

        webrs.rewrite(format!(r"
            pub fn file(path: &str) -> Option<&'static [u8]> {{
                match path {{
                    {}
                    &_ => None,
                }}
            }}
        ", mappings));
    });
}

许可证

在 MIT 许可证下授权(LICENSEhttps://opensource.org/licenses/MIT

贡献

除非您明确声明,否则您提交的任何旨在包含在 Devbox 中的贡献,均应按 MIT 许可证授权,不附加任何其他条款或条件。

依赖关系

~3–12MB
~127K SLoC