替换makefile的构建管理器真棒。它允许非常快的建设!

AwesomeBuild的Python项目详细描述


awesomebuild

理念

与makefiles类似,awesomebuild是在规则中构造的。每个规则可能依赖于其他规则,并且可能包括所谓的触发器,用于检查规则是否需要运行。

用法

usage: AwesomeBuild [-h] [--config CONFIG] [targets [targets ...]]

Awesome build manager to replace Makefiles. It allows very fast building!

positional arguments:
  targets          defaults to the main rule defined in the config file

optional arguments:
  -h, --help       show this help message and exit
  --config CONFIG  default: awesomebuild.json
  --status STATUS  Relative to project folder, default: awesomestatus.json
  -j JOBS          Maximum number of jobs running in parallel. Defaults to the
                   number of cores available.
  --updater        Run Updater to fix deprecations.

配置

首先,您需要在项目的主目录中创建名为awesomebuild.json的配置文件。

{"project":"TestProject","import":{"rules":[]},"main":"mainrule","rules":{}}

空属性可以省略。

酒店概述:

项目:项目名称

导入:在这里可以定义要导入的外部配置文件。当前唯一可用的导入类型是规则

main:定义用户未定义目标时运行的规则。此规则可以在外部配置文件中定义。

规则:在这里您可以定义规则。

规则定义

"rule-name":{"cmd":["cmd1",{"type":"the-type","cmd":"cmd-1","rule":"rule-2"}],"call":["other-rule-1","other-rule-2"],"callBefore":["other-rule-3","other-rule-4"],"callAfter":"other-rule-5","trigger":[],}

所有属性都可以省略或作为单个值或列表提供。 "property":"hello world""property":["hello world"]相同,"property":[]与省略property相同

cmd:这定义了要执行的(shell)命令。 定义命令有两种方法:

  1. "cmd"定义一个简单的shell命令。
  2. 调用命令或规则可以定义为json。它允许在shell逗号之间调用其他规则,而且不仅在所有shell命令之后,还可以与不推荐使用的属性call
{"type":"the-type","cmd":"cmd-1","rule":"rule-2"}

属性: 类型:此属性定义此命令是shell命令(cmd)、规则(rule)还是awesomebuild的内部命令(awesomebuild)。 cmd:此属性定义awesomebuild的shell命令或thw内部命令。 规则:此属性定义要执行的规则的名称。

所有shell命令都在主项目目录中运行。

callbefore:此属性处理所有需要在之前运行的规则。

callafter:此属性处理需要在其之后运行的所有规则。调用有一点不同。检查规则执行

触发器:此属性处理规则的触发器。

不推荐的属性:

调用:此属性处理将运行的其他规则。它应该在cmd属性中迁移。

内部命令

有时规则需要与awesomebuild的当前实例通信。以下命令目前已知:

  • 重置状态:将状态文件重置为默认值。

触发器定义
{"type":"trigger type","subtype":"trigger sub type","value":"value for trigger"}

当前已知的触发器是:

<表><广告>键入子类型 值用法< /广告><正文>文件更改文件路径文件存在文件路径文件不存在文件路径目录更改目录路径目录存在目录路径目录不存在目录路径

导入规则

{"rules":"name","type":"importtype","value":"path"}

酒店概述:

规则:这可以是单个规则的名称"rules":"rule name"、规则列表"rules":["rule-1"、"rule-2"]或通配符"rules":"*"以导入找到的所有规则。

类型:这定义是导入单个文件还是导入整个目录(递归地)。

:定义文件或目录的路径。

规则执行

  1. 如果定义了callbefore规则,则这些规则将是exec现在取消了。如果在上次执行当前规则后执行了其中任何一个,则将设置run变量。检查状态属性"rules callbefore" rel="nofollow">status property规则callbefore
  2. 如果定义了触发器,则现在将检查这些触发器。如果这些触发器中的任何一个为正或未定义触发器,则将设置run变量。
  3. 如果设置了run变量,则cmds将立即运行。
  4. 如果设置了run变量,则"call-rules"将立即运行。
  5. 如果定义了callafter规则,这些规则将立即运行。

深入的信息

状态文件

要允许快速生成(跳过生成步骤),必须保存一些有关源文件和生成文件的上次已知生成状态的信息。因此,awesomebuild保存了许多散列,这些散列在规则执行时进行检查。如果哈希不匹配,awesomebuild将触发重建。 所有信息都保存在文件awesomestatus.json中。它的大部分内容都包含SHA512散列,以防止容易操作。

状态属性awesomestatusversion

状态文件的结构将不时更改。因此文件的版本保存为整数。加载时,awesomebuild将检查版本并根据需要更新状态文件。

状态属性配置状态

当配置更改时,awesomebuild将触发重建。为了检查配置更改,它生成完整配置的sha512散列。如果awesomebuild检测到哈希不匹配,它将清除状态文件的规则规则调用before触发器属性。

状态属性规则

执行规则后,awesomebuild保存python的time.time()函数字符串的sha512散列。

状态属性规则调用前

每个规则都必须知道其callbefore规则是否已执行。通过在所有受影响规则的时间散列的组合字符串上生成sha512散列来检查。通过使用这种方法,我们可以只运行所有callbefore规则,而不关心它们是否真的运行,因为我们需要检查以前执行过的规则。

状态属性触发

每个触发器可能需要保存其状态信息。检查触发器

触发器

(不)存在触发器

检查文件/目录是否存在的技术应该非常清楚;-)

更改的触发器

检查文件/目录更改的最有效方法是使用inotify。因此,我们需要有一个脚本运行的所有时间。这可以在更高版本中实现。

文件更改触发器

若要检查文件是否已更改,则SomeBuild会在文件内容上生成SHA512哈希值。

目录更改触发器

目录在文件数量和大小上都可能非常大。对所有文件内容生成校验和将非常低效。因此,awesomebuild在尽可能多的元数据上生成校验和。它在ls-rlgagi--time style=+%s path的输出上生成sha512散列。这样,在文件更改时触发重建应该是相当安全的。如果您有更好的解决方案,请随时提出问题/pr:)

多线程

为了加快构建速度,awesomebuild允许多线程。通常,最大运行作业数由CPU核心数定义。使用-j参数可以覆盖此值。

碰撞预防

为了防止并行执行同一条规则,jobmanager将保留处于任何执行状态的规则列表。如果启动同一规则的第二个实例,会话管理器将阻止它正在执行并保持它,直到第一个实例被注销。

线程数限制

为了限制并行运行线程的数量,jobmanager将保留当前正在执行命令的规则列表。如果规则要运行命令,则必须等到当前运行的命令数低于允许的最大线程数。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
ArrayList Java中的搜索字符串   另一个web应用程序的java访问会话   另一个应用程序中的活动和服务之间的java通信   java根据Json字符串类型将Json字符串转换为对象   eclipse如何解决java中的错误异常。lang.NoSuchMethodError:'java。字符串javax。摆动JOptionPane。showInputDialog(java.lang.String)'   线程“main”java中的安卓异常。lang.NoClassDefFoundError:org/codehaus/jackson/JsonParseException   java如何在安卓 emulator上显示Mat图像?使用NDK   Java在本地读取测试源文件,但在服务器上读取失败   java dowhile循环用于计算输入数字中的数字。故障排除代码   JAva初学者在编写获取成本的方法时遇到困难   java是shell游戏。我如何让物体移动,特别是在特定的曲线上,但顺序是随机的?   java如何区分两个同名的JButton   java为什么我在Spring Boot中需要一个接口?   java将文件路径插入数据库将删除\   使用InterfaceType初始化java对象   java如何部署一个分为Angular、Spring Boot和MySQL的项目?   java如何使用Symja解决不等式?