一个简单的小项目构建工具。

buildit的Python项目详细描述


构建

什么?

BuildIt是一个简单的构建工具,可以进行替换, 意思是它基于其他文件构建文件, 听了你的指示。 修改原始源文件时, bld 将重新创建依赖于它们的最终产品。 相反,如果什么都没有改变,就什么也没有做。 这种类型的实用程序对于避免不必要的工作很重要 (以及由此浪费的时间) 如果使用"哑"脚本或批处理文件 通过中间步骤自动化冗长的操作。

这类事情的例子是众所周知的编译步骤 程序, 或者javascript和css文件的 lint minify 压缩部署步骤。 buildit专注于这些简单的用例。

H3>谁?

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一样。

    属性

    保留了几个属性名:

    执行

    每个规则中必须至少有一个( 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

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

    推荐PyPI第三方库


    热门话题
    直接组件的javacamel-Junit测试   java@ConfigurationProperties在控制器注释类中工作,但在组件类中不工作   Eclipse中的java相对路径   java如何检查变量名是否包含字符串,然后输出字符串变量内容   java JPA CriteriaQuery<Object[]。类>和单个字段的多选返回列表<Object>   java通用同步代码块[无对象锁定]   JAVA网安卓中的URL。。新手问题   java如何分析运行Tomcat的嵌入式H2数据库的内存消耗?   这里不允许使用java Void   hibernate警告[commonLogger.java:60]ognl。MethodFailedException:对象[java.lang.NoSuchMethodException:([Ljava.lang.String;)]的方法失败   java静态类代替Oracle表如何   JAVA LWJGL纹理旋转   java是否有用于ical4j的类型化包装器?   java使用maven生成校验和并存储指定文件夹中的MD5文件   java如何定义文件的相对路径?   java对于gradle项目是否有一个等价的“mvn依赖项:buildclasspath”?   JavaHadoop文件系统。mkdirs(路径,权限)忽略该权限