38 个版本 (4 个破坏性更新)
0.5.2 | 2023年8月2日 |
---|---|
0.5.0 |
|
0.4.3 | 2023年3月7日 |
#818 在 命令行工具
每月79 次下载
96KB
2K SLoC
neomake
neomake
是一个任务运行器 CLI 工具,作为已知工具如 Makefile
的现代替代品。
项目状态
neomake
已发布并 稳定。它正在积极维护并用于生产。
特性
- DAG执行
任务在节点中运行。节点可以链接在一起以创建DAG。只需指定要执行的所有节点,它将自动根据定义的依赖关系创建DAG。 - 并行任务执行
DAG生成称为阶段。阶段按顺序执行,而阶段内的所有任务都并行执行。工作负载在操作系统线程中执行。默认的线程池大小为1,但可进行配置。 - 矩阵调用
指定用于多次调用节点的n维矩阵。您可以定义密集和稀疏矩阵。节点将在矩阵笛卡尔积的每个元素上执行。 - YAML
无需任何复杂的配置格式或语法。整个配置都在易于理解的yaml
文件中完成,包括对 YAML 锚点(以及 YAML 1.2 标准中的所有内容)的支持。 - 自定义环境
您可以为neomake
使用的解释器(如 bash 或 python)自定义哪个 shell 或程序。您还可以指定通过命令行提供的参数、工作目录和环境变量,并在多个不同级别上指定。通常,内部作用域中定义的值将扩展并替换外部作用域。 - 计划与执行
支持分两个阶段执行命令。首先计划并渲染整个执行过程。然后使用计划调用执行引擎。这样,计划可以在执行之前存储和审查。
安装
neomake
通过 cargo
分发。
- 对于最新稳定版本
cargoinstall neomake
- 对于前沿的master分支
cargo install --git https://github.com/replicadse/neomake.git
示例
首先,使用以下命令初始化示例工作流程文件。
neomake workflow init -tpython
现在,执行 count
节点。默认情况下,neomake
只使用一个工作线程并执行无尽的嵌入式 Python 程序。
neomake plan -ccount | neomake x
为了执行所有4个期望的执行(定义为2x2矩阵),请使用所需的工作线程数调用neomake。现在您将看到4个程序将并行执行。
neomake plan -ccount | neomake x -w4
图执行
按照以下方式执行节点。
neomake plan -f ./test/.neomake.yaml -c bravo -c charlie -oron | neomake execute -fron
节点可以定义一个依赖数组(其他节点),这些节点需要先执行。所有节点执行都是去重的,以确保每个节点在请求调用或作为任何级别的先决条件时仅执行一次。除了可以指定每次命令行调用中要执行的多节点外,此功能还允许执行复杂的工流程。
假设以下节点及其依赖关系的图
neomake ls
---
nodes:
- name: A
- name: B
- name: C
pre:
- A
- name: D
pre:
- B
- name: E
pre:
- A
- D
换句话说,A
和B
是没有先决条件的节点,而C
依赖于A
和D
依赖于B
。值得注意的是,E
依赖于A
和D
。这意味着E
也暂时依赖于A
的任何依赖({}
)和D
({B}
)。
也可以获得要执行的工流程的简单描述。
neomake describe -cC -cE
---
stages:
- - A
- B
- - D
- - E
由于它们的节点依赖于先前阶段中执行的节点,阶段需要顺序运行。阶段内的任务以并行方式运行(在给定给worker
参数的OS线程池中)。neomake
还能够识别和防止执行图中的递归,如果在尝试执行此类子图时将失败。
为什么
为什么有人要构建任务运行器,当有那么多替代品时?以下是一些最著名的任务运行实用程序/框架(非详尽)
make
(Makefile
)- 原版以及许多不同的实现Earthly
(Earthfile
)- 在容器中执行任务pyinvoke
(tasks.py
)- 从Python脚本中执行任务
我构建了这个实用程序,因为我尝试过的所有替代方案,包括上面列出的,都缺少一些功能。我基本上在寻找GitLab管道提供的功能子集,包括矩阵构建等功能。特别是像在许多位置调用命令、并行化任务、易于参数化等功能。
示例配置
<-- ../res/templates/max.neomake.yaml -->
有关更多示例,请调用neomake workflow init --help
或使用neomake workflow schema
查看模式。
模式
<-- ./schema.json -->
依赖关系
~13–27MB
~355K SLoC