替换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)命令。
定义命令有两种方法:
"cmd"
定义一个简单的shell命令。- 调用命令或规则可以定义为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":"*"
以导入找到的所有规则。
类型
:这定义是导入单个文件还是导入整个目录(递归地)。
值
:定义文件或目录的路径。
规则执行
- 如果定义了
callbefore
规则,则这些规则将是exec现在取消了。如果在上次执行当前规则后执行了其中任何一个,则将设置run变量。检查状态属性"rules callbefore" rel="nofollow">status property规则callbefore - 如果定义了触发器,则现在将检查这些触发器。如果这些触发器中的任何一个为正或未定义触发器,则将设置run变量。
- 如果设置了run变量,则
cmd
s将立即运行。 - 如果设置了run变量,则"call-rules"将立即运行。
- 如果定义了
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将保留当前正在执行命令的规则列表。如果规则要运行命令,则必须等到当前运行的命令数低于允许的最大线程数。
推荐PyPI第三方库
time.time()
函数字符串的sha512散列。ls-rlgagi--time style=+%s path
的输出上生成sha512散列。这样,在文件更改时触发重建应该是相当安全的。如果您有更好的解决方案,请随时提出问题/pr:)-j
参数可以覆盖此值。