============
项目描述
Buildout食谱提供可重用的Python模块,用于常见的配置任务。最广泛使用的食谱通常提供低级功能,如安装蛋或软件发行版,创建配置文件等。正常的食谱框架非常适合构建这些通用组件。
完整的应用程序可能需要许多部分,通常需要数十个部分。定义组成应用程序的许多部分可能会很繁琐,并且往往涉及大量重复。Buildout提供了一些机制来避免重复,包括配置文件的合并和宏,但这些虽然在一定程度上有用,但扩展性不好。Buildout既不是也不是编程语言。
元食谱允许我们利用Python为构建提供高级抽象。
元食谱是一个主要操作通过创建部分的常规Python食谱。元食谱不仅仅是高级食谱。它是一种通过操作构建数据库来将大部分工作推迟到较低级别食谱的食谱。
不幸的是,Buildout还没有提供创建部分的API。它有一个私有的低级API,已被提升为公共API(这意味着它不会被未来版本破坏),编写所需的高级API很简单,但在每个元食谱中重复高级API很烦人。
这个小包提供了元食谱所需的高级API和简单的测试框架。它将被合并到未来的Buildout版本中。
在PyCon 2011的演示中描述了早期元食谱的工作。
简单的元食谱示例
让我们看看一个相当简单的元食谱示例。首先,考虑一个构建数据库部署的Buildout配置
[buildout] parts = ctl pack [deployment] recipe = zc.recipe.deployment name = ample user = zope [ctl] recipe = zc.recipe.rhrc deployment = deployment chkconfig = 345 99 10 parts = main [main] recipe = zc.zodbrecipes:server deployment = deployment address = 8100 path = /var/databases/ample/main.fs zeo.conf = <zeo> address ${:address} </zeo> %import zc.zlibstorage <zlibstorage> <filestorage> path ${:path} </filestorage> </zlibstorage> [pack] recipe = zc.recipe.deployment:crontab deployment = deployment times = 1 2 * * 6 command = ${buildout:bin-directory}/zeopack -d3 -t00 ${main:address}
此构建过程不是构建软件,而是构建配置,用于使用已部署的软件部署数据库配置。然而,对于本文档而言,这些细节并不重要。
我们不需要每次都手动编写上述配置,而是可以编写一个元配方来自动生成它。我们将按照以下方式使用我们的元配方:
[buildout] parts = ample [ample] recipe = com.example.ample:db path = /var/databases/ample/main.fs
这里的理念是元配方允许我们指定所需的最小信息。元配方通常自动化与应用程序和组织相关的策略和假设。例如,上面的例子假设我们希望在周六打包到3天前。
现在,让我们看看自动完成此任务的元配方:
import zc.metarecipe class Recipe(zc.metarecipe.Recipe): def __init__(self, buildout, name, options): super(Recipe, self).__init__(buildout, name, options) self.parse(''' [deployment] recipe = zc.recipe.deployment name = %s user = zope ''' % name) self['main'] = dict( recipe = 'zc.zodbrecipes:server', deployment = 'deployment', address = 8100, path = options['path'], **{ 'zeo.conf': ''' <zeo> address ${:address} </zeo> %import zc.zlibstorage <zlibstorage> <filestorage> path ${:path} </filestorage> </zlibstorage> '''} ) self.parse(''' [pack] recipe = zc.recipe.deployment:crontab deployment = deployment times = 1 2 * * 6 command = ${buildout:bin-directory}/zeopack -d3 -t00 ${main:address} [ctl] recipe = zc.recipe.rhrc deployment = deployment chkconfig = 345 99 10 parts = main ''')
元配方只是向构建过程中添加组件。它是通过调用继承的 __setitem__ 和 parse 方法来实现的。parse 方法仅接受 ConfigParser 语法中的字符串。当我们想要添加静态或几乎静态的组件数据时,它很有用。当我们对组件数据有非平凡的计算时,setitem 语法很有用。
我们添加组件的顺序很重要。当添加组件时,任何字符串替换和其他依赖关系都会被评估,因此必须先定义引用的组件。这就是为什么,例如,pack 组件是在 main 组件之后添加的原因。
请注意,元配方为其中一个选项提供了一个整数。除了字符串之外,还可以提供整数和 unicode 值。
测试
现在,让我们来测试它。我们将使用 zc.metarecipe.testing 模块提供的模拟构建过程来测试它,而不是实际运行 buildout。
>>> import zc.metarecipe.testing >>> buildout = zc.metarecipe.testing.Buildout()>>> _ = Recipe(buildout, 'ample', dict(path='/var/databases/ample/main.fs')) [deployment] name = ample recipe = zc.recipe.deployment user = zope [main] address = 8100 deployment = deployment path = /var/databases/ample/main.fs recipe = zc.zodbrecipes:server zeo.conf = <zeo> address ${:address} </zeo> <BLANKLINE> %import zc.zlibstorage <BLANKLINE> <zlibstorage> <filestorage> path ${:path} </filestorage> </zlibstorage> [ctl] chkconfig = 345 99 10 deployment = deployment parts = main recipe = zc.recipe.rhrc [pack] command = ${buildout:bin-directory}/zeopack -d3 -t00 ${main:address} deployment = deployment recipe = zc.recipe.deployment:crontab times = 1 2 * * 6
当我们调用我们的配方时,它将向测试构建过程中添加部分,并将这些部分简单地打印出来,以便我们可以验证是否生成了正确的数据。
就是这样。
变更
0.2.1 (2014-01-24)
- 修复:在解析配置文本时,部分输入和
同时按部分排序顺序评估。如果排序早的部分引用了排序晚的部分,则会导致问题。
0.2.0 (2012-09-24)
在设置选项值时,unicode 和 int 值将被转换为字符串。其他非字符串值将被拒绝。之前,在设置从使用 JSON 的 ZooKeeper 树读取的值时,很容易从 buildout 中获得错误,因为 ZooKeeper 树是 unicode。
修复:在使用元配方 parse 方法时,由于 ConfigParser 的工作方式,生成的部分添加顺序是非确定性的。不是按排序顺序按部分名称将部分添加到构建过程中。
0.1.0 (2012-05-31)
初始发布
项目详情
zc.metarecipe-0.2.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7fba976ef65d8e8c70b86ec6a77b2331ab5ab9fa988d1ec9d448d16a2bc848a2 |
|
MD5 | 4550c1fcf0c980fcdc0c9d4a6a9fff3b |
|
BLAKE2b-256 | 164a6396dd27178e193cde04d9182c23e9ed8afa51205a388e73d1600f028309 |