一个简单的小项目构建工具。
buildit的Python项目详细描述
构建
BuildIt是一个简单的构建工具,可以进行替换, 意思是它基于其他文件构建文件, 听了你的指示。 修改原始源文件时, bld 将重新创建依赖于它们的最终产品。 相反,如果什么都没有改变,就什么也没有做。 这种类型的实用程序对于避免不必要的工作很重要 (以及由此浪费的时间) 如果使用"哑"脚本或批处理文件 通过中间步骤自动化冗长的操作。
这类事情的例子是众所周知的编译步骤 程序, 或者javascript和css文件的 lint minify 压缩部署步骤。 buildit专注于这些简单的用例。
BuildIt试图对人类(即新来者、IT人员和 设计人员,虽然对于开发人员来说仍然很有用 项目。 不仅是今天,而且是九个月后。
…不使用make? 好吧,好问题。 我已经用了很多年了, 但是像许多人一样 从不关心它 很大程度上是因为它奇怪的方式。 如果你最近没有使用过它,你会觉得很神秘。 每次使用工具时都要查阅手册,这很乏味, 因为事情并不明显。 make 散发出一丝受虐和80年代资源限制的气息。 ;
同样,我调查了scons和cmake, 但是对于简单的用例来说它们是复杂的 需要读书才能开始 (如果您想理解而不是剪切粘贴)。 也试过埃克尔的 builder.py 发现它很漂亮。 尽管python非常适合逻辑和字符串操作, 不善于执行命令… 这是我小项目最需要的。 然而,像bash这样的交互式shell是针对这种情况而优化的。
尽管这些程序非常健壮, 不幸的是,他们往往使简单的事情变得困难。 最好是,我一直在找如下的东西。
设计目标
-
易于使用,请稍后记住
-
一种已知的简单文件格式,并且
-
脚本语言的选择,已知的,
-
它的工作原理是在有意义的情况下使之成为。
要检测更改,buildit当前比较文件的时间戳, 这在本地上下文中使用的文件系统上就足够了。 这包括通过ssh进行远程登录。
安装
如有必要,首先安装pip:
sudo apt-get install python-pip # s/apt-get/yum/
>:
sudo pip install buildit
如果使用低于2.7的python版本,则还将安装 ordereddict 。 在3.0下,它将安装 ushlex 。 (此软件包当前不支持Python3。)
Linux只是暂时的。 理论上它应该在windows/osx上工作, 尽管我还没有试过。
使用
文件格式
buildit使用ini文件格式,用utf-8编码。 尽管有局限性, ini非常适合描述具有属性的项 需要人类阅读和书写。 格式是扩展版本 (由python的 配置分析器 ) 增加了变量。 一个显著的变化是它被修改为使用更简单的 %name (或 pre%{name}post )shell样式的变量扩展 而不是更麻烦的 %(printf)s 样式。
如下图所示, 一般的 .ini 文件是方括号中的节名称列表, 每一个都有一个名称到值(aka attributes)的映射。 注释以一行开头的字符开始:
# Below, a section with two attributes, # the second using variable expansion: [Section1] attribute_one = 1 attribute_two = attribute_one is equal to %attribute_one attribute_three = To continue to additional lines, --> make sure to indent them like this.
注意上面的属性2。 文本 %属性将在加载时替换为其值。 在发生任何其他情况之前,先替换这些值,然后 未知变量将引发错误。
生成文件
因此,具有适合于buildit的构建规则的ini文件 可以称为生成文件或生成脚本。 一个简单的连接和压缩javascript的方法可能看起来像下一个 例子。 每个节名都是一个"目标文件",我们要在它下面构建它 组成 规则的各种属性一起创建它。
一个例外是包含全局变量的可选 [vars] 部分 适用于所有规则。 必须是第一部分:
[vars] │ Comments: basejs = foo.js │ Global variable(s). │ [foo.js.gz] │ Target: this file needs to be built, deps = %basejs foo2.js │ Deps: using these input files, exec = gzip -c %deps > %me │ Exec: in this manner. │ [clean] │ A dummy target. exec = rm -f foo.js.gz │
注意底部名为clean的"dummy"目标。 它没有"deps",也就是依赖关系, 在命令行作为参数传递时始终运行, 就像make一样。
属性
保留了几个属性名:
- me -不由用户设置。 输出文件,也称为目标文件和节名。 可用于exec等属性。
- deps -目标依赖的文件列表, 用空白隔开。 因此,必须引用带有空格的名称。
- 扩展 -从另一个目标继承属性, 类似于基类,aka 不要重复自己。 如果你发现自己在剪贴, 停止并改用 extends=target 。
- workdir -为当前目标选择不同的工作目录。
执行
每个规则中必须至少有一个( exec 或 deps )属性。 以下属性名称也被保留:
- preexec -设置脚本
- 执行 -主脚本
- 后执行程序 -退出左后台
规则的执行属性是特殊的,因为它们可以带有后缀 包含所需外壳的名称, (默认为 sh )。 要选择不同的shell(例如bash), 可以改为设置以下属性:
exec.bash = line1... line2... etc.
这些可能是您想要的任何外壳,只需将其名称添加到末尾。 有几种语言(py、pl、rb、js(node))的快捷方式,例如:
exec.py = print "hello world!"
如果buildit决定需要构建一个目标, 它的执行属性将运行。
注意事项
使用 %deps 和 %me 变量非常重要,因为它们使 更难编写缺少、未跟踪或过时的规则 依赖关系。
使用 %me 也有助于防止错误损坏以前的 目标文件成功。 当使用 %me 时,输出文件将首先使用 .tmp 扩展名写入, 在脚本完成之前不移到最终文件名 错误(返回退出状态代码 0 )。
防止文件解析器试图扩展 传给炮弹, 将任意百分比的字符加倍以转义:
exec.bash = stat -c %%y foo.txt
扩展百分比是故意选择的, 因为它很少与shell代码冲突。
一般规则
如果你有很多文件,为每个文件创建一个规则会很快变得乏味。 这是通用规则派上用场的时候。 下面演示如何使用文件名构建每个依赖项 以 .o 结尾,不单独指定:
[*.o] deps = *.c exec = %CC %CFLAGS %deps -o %me
请参见下面的完整示例。
运行它
$ bld -h $ bld [target] $ bld
帮助( -h )打印使用信息、选项以及可用目标。 在没有参数的情况下运行bld将运行 文件 /buildit.ini 类似make。 因此,这是一个放置"全部"目标的好地方。
示例运行
sudo apt-get install python-pip # s/apt-get/yum/0 好的。再次测量:
sudo apt-get install python-pip # s/apt-get/yum/1
返回代码
- 0 -全部清除
- n -命令执行错误
- nn -来自buildit的错误代码,请参见cat/usr/include/sysexits.h
下一步…
- 完整的例子可以在 示例文件夹
- BuildIt被设计为对部署和 配置管理工具pave