跨多个git回购项目的通用构建系统

butcher的Python项目详细描述


已过时:您不想使用它。使用Bazel 相反。

这是我2013年在Cloudscaling工作的一个项目。我们的目标是 使用规则为跨越多个源存储库的项目构建系统 类似于Bazel’s BUILD files和 强调正确性和可重复性。巴泽尔还没有被释放到 当时是公开的,我不知道还有其他的构建系统 与版本控制系统巧妙集成,或直接寻址 跨项目源依赖项,所以我重新开始。

Butcher做了各种假设,使其无法按原样使用:

  • 假设所有源都在git存储库中
  • 假设所有git存储库共享相同的基url,除非映射 它们都指向带有--map_repo
  • 假设您要构建的所有项目都具有屠夫风格 在其源repo中生成文件

我那时是一个相对缺乏经验的程序员,所以屠夫也很普遍 如果我开始一个 又是这样的计划。尽管如此,我还是从这个项目中学到了很多东西, butcher在Cloudscaling作为我们的内部构建工具非常有用 各种各样的项目。

屠夫的目标地址与bazel的target labels非常相似 在远程存储库中指定git ref的附加语法:

//repo_name[git_ref]/dir/in/project:target

如果省略地址的[git_ref]部分,屠夫将使用 在命令行上用--default_ref指定的值。默认情况下 也就是HEAD,在远程git中通常意味着master。 储存库。

要将任何//repo_name与实际的git存储库url相关联,请使用 另一个命令行标志:--map_repo=<repo_name>:<git@url.here:etc/etc>

巴泽尔有一个更好和更彻底的远程工作设计 项目存储库;有关working with external dependencies的更多信息,请与bazel文档进行比较。

Butcher中实现了几种类型的构建规则。大多数都有 相当好的文档作为实现类中的docstring, 很明显,我们应该如何实现附加的规则类型 在看过一些现有的规则之后。

  • genrule运行任意shell命令作为生成 规定的产出。这包括一个类似makefile的cmdline子语言 定义目标时的扩展(see the source for details
  • gendeb将其他规则的输出打包到debian包中。这个 假设您在本地安装了fpm,这并不理想。
  • filegroup收集文件(其他规则的源或输出) 给它们取一个集合名,然后作为 其他规则。
  • pkgfilegroup类似于文件组,但它添加的元数据是 作为gendeb等规则的输入和用于设置的映射特别有用 文件所有权和最终输出包中文件的权限。
  • pkg_symlink似乎未完成,但它应该是放置 gendeb包中的symlink。
  • virtual目标可用于将一堆其他目标组合为 单一可构建地址。

Butcher最初的项目自述如下:


Butcher是一个本着PantsBuckBlaze精神的软件构建系统。

与其他类似的工具一样,Butcher鼓励创建可重用的小型工具 模块,重点是提高构建过程的效率和速度。什么 使Butcher与众不同的是它与分布式Git存储库的集成,而不是 而不是依赖大型的统一代码库。

Butcher使用构建缓存来加速增量构建并避免重复 工作。缓存存储基于组合校验和的对象(在 作为生成它们的所有输入的metahash)的代码和文档, 并按每个文件自己的校验和对对象进行重复数据消除。这个系统使 使用硬链接,因此有利于屠夫有各种各样的工作 同一文件系统上的目录(缓存、git客户端、构建区域)。

限制

一般

  • 生成当前是顺序的,而不是并行的。
  • 在运行“屠夫清理”之前,构建使用相同的构建区域,这 可能掩盖或引入错误。

缓存

  • 缓存由元哈希键控,但检索是每个文件完成的。
  • 缓存不为 验证。应该的。
  • 缓存只是本地的,根本不联网。

即将推出的功能

  • 一切

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

推荐PyPI第三方库


热门话题
Java如何在泛型类中调用我的类T的方法   java如何在XML配置中添加quartz JobListener(springframework)   java JPA查询以空值结束   密码学为什么Java DES密钥生成器生成的密钥大小不正确?   java布尔算法在输出为假时生成真输出   java缓存休眠混乱的行为   java如何让Android SDK 1.5版在我的G1手机上运行?   java无状态应用程序Spring安全性   Eclipse上的java,“首选项>常规>工作区>使用本机挂钩或轮询刷新”做了什么?   java私有静态方法从公共静态方法访问   滚动窗格JavaFX中图形上的java静态标签   如何从Oracle Java教程中调用findLargest方法(使用接口作为类型)   JavaEE:EJB远程接口中的自定义类