#language #automation #interpreter #dsl #make #variables

build instruct

一种用于编写通用“makefile-like”任务的通用语言,功能强大且可重用。

1 个不稳定版本

0.1.0 2022年5月28日

#544构建工具

MIT 许可证

84KB
2K SLoC

Instruct

codecov

一种用于编写通用“makefile-like”任务的通用语言,功能强大且可重用。

状态

该项目基本可用!

  • 解析
    • []
  • 静态分析
  • 解释器
  • 任务项目定义和配置文件
  • [] 依赖系统
  • [] 运行系统
    • 命令行
    • [] ssh
    • [] docker
    • [] python
  • [] 测试系统

目标

我的目标是为此项目提供一个替代 makefile/bash 脚本的选择,尤其是针对 devops 世界。
大多数情况下,自动化代码只是简单地放入几个 bash 脚本或直接放入管道配置文件中,这使得它们难以维护/重用。

因此,这种语言致力于实现以下目标:

  • 易于阅读和理解的干净语法
  • 任务的可重用性
  • 简单的包/依赖系统
  • 对多个执行器的原生支持
    • 简单的shell
    • Docker
    • Python

示例

一个目前完全工作的小型示例。

module as variables;

collection as interpolate: {
    let (final_stdout: stdout) from task as stdout: {
        let (pre_var: var) from block as pre: {
            let (var: stdout) from run with (trim_stdout): echo pre;
            run: echo dyn_${var};
        };
        let (stdout) from run with (trim_stdout) as main: echo interpolated '${pre_var}' used in main;
        block as post: {
            let (stdout) from run with (stdin: stdout): sed s/main/post/g;
            run: echo ${stdout};
        };
    };

    task as call: {
        let (final_stdout) from call as main: variables.interpolate.stdout;
        run as post: echo ${final_stdout} used after call;
    };

    task as exit-code: {
        let (status1: status) from run as pre: cat Cargo.toml;
        let (status2: status) from run as main: cat random_file.json;
        run as post: echo "cat Cargo.toml: $${status1}, cat random_file.json: $${status2}";
    };
};

可以使用 cargo 执行

cargo run variables.interpolate.stdout
cargo run variables.interpolate.exit-code

依赖项

~6–15MB
~171K SLoC