ZC Buildout配置/构建/构建安装的配方
项目描述
通过configure/make/make install安装下载的配方
configure-make-make-install配方自动将基于configure的源代码分布安装到buildouts中。
选项
- url
要下载的源存档的URL
- configure-command
configure脚本的名称。
默认值为./configure。
- configure-options
基本的configure选项。
默认为指向部分目录的--prefix选项。
- extra_options
要传递给configure的额外选项字符串(除了基本选项之外)。
- environment
可选的NAME=VALUE格式的环境变量设置。
换行符将被忽略。只要它们不会被误认为是环境设置,就可以在环境值中包含空格。
environment = FOO=bar baz
设置环境变量FOO,但
environment = FOO=bar xxx=baz
设置2个环境值,FOO和xxx。
- patch
应用于分布的可选补丁文件的名称。
- patch_options
如果使用补丁文件,提供给补丁命令的选项。
默认为 -p0
- 共享
在构建点之间共享构建。
- autogen
运行以生成配置脚本的脚本的名称。
- source-directory-contains
在发行版源目录中的文件名。
该配置用于确定是否已找到源目录。默认为“configure”。
发布历史
4.0 (2023-07-07)
放弃对Python 2.7、3.5、3.6的支持。
添加对Python 3.9、3.10、3.11的支持。
3.0.0 (2019-03-30)
放弃对Python 3.4的支持。
添加对Python 3.7和3.8a2的支持。
使用Flake8对代码进行检查。
2.0.0 (2017-06-21)
添加对Python 3.4、3.5、3.6和PyPy的支持。
在Travis CI上启用了自动化测试。
1.3.6 (2014-04-14)
修复:错误地使用“is not ‘’”而不是“!=”比较字符串。
修复:安装位置不允许有空格。
1.3.5 (2011-08-06)
修复:环境变量不允许有空格。
修复:添加了缺失的选项参考文档。
1.3.4 (2011-01-18)
修复了一个在位置记录中导致的错误,该错误会导致当某个部分不再需要共享构建时从磁盘删除共享构建。 (#695977)
使测试通过zc.buildout 1.4和1.5,提高了zc.buildout的上限版本。 (#695732)
1.3.3 (2010-11-10)
当cmmi成功时删除临时构建目录。
指定zc.buildout版本为 <1.5.0b1,因为当前配置不兼容zc.buildout 1.5。
1.3.2 (2010-08-09)
当无法下载源时,删除共享构建的构建目录。
声明对zope.testing的测试依赖。
1.3.1 (2009-09-10)
声明对zc.buildout 1.4或更高版本的依赖。此依赖自1.3版本引入。
1.3 (2009-09-03)
使用zc.buildout的下载API。由于这允许MD5检查,因此添加了md5sum和patch-md5sum选项。
添加了更改配置脚本名称和覆盖--prefix参数的选项。
将核心“configure; make; make install”命令序列移动到可以在其他配置中重写的方法,以支持安装过程略有不同的包。
1.2.1 (2009-08-12)
错误修复:跟踪重用的共享构建。
1.2.0 (2009-05-18)
启用了使用完成构建的共享目录。
1.1.6 (2009-03-17)
将‘zc’包从检出根目录移到‘src’,以防止测试运行器找到buildout本地安装的eggs。
删除了Python 2.6下的弃用项。
1.1.5 (2008-11-07)
在README.txt文件中添加了对SVN仓库的链接,以便当请求安装zc.recipe.cmmi的“-dev”版本时,Setuptools可以自动找到开发版本。
应用了对错误#261367的修复,即更改正在下载的文件的open()为二进制,因此Windows下不再出现如下错误。
uncompress = self.decompress.decompress(buf)错误:解压缩错误-3:距离太远
1.1.4 (2008-06-25)
添加了对autogen配置文件的支持。
1.1.3 (2008-06-03)
添加了对更新环境的支持。
1.1.2 (2008-02-28)
在创建之前检查location文件夹是否存在。
1.1.0之后
添加了从url下载补丁的支持,而不是仅使用文件系统上的补丁。
1.1.0
添加了对
download-cache:下载的文件在缓存缓存中的“cmmi”子目录中缓存,缓存密钥是文件的下载url的散列,缓存信息记录在每个目录内的cache.ini文件中
离线模式:如果包不在缓存中,cmmi不会上线
变量位置:如果需要,除了部分目录之外的构建文件
额外的日志/输出
1.0.2 (2007-06-03)
添加了对补丁的支持。
测试修复(buildout的输出已更改)
1.0.1 (2006-11-22)
添加了缺失的zip_safe标志。
1.0 (2006-11-22)
初始发布。
详细文档
我们有一个包含演示foo tar包的存档,并通过http发布,以便查看离线效果
>>> ls(distros) - bar.tgz - baz.tgz - foo.tgz>>> distros_url = start_server(distros)
让我们更新一个示例构建,以便安装它
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = foo ... ... [foo] ... recipe = zc.recipe.cmmi ... url = %sfoo.tgz ... """ % distros_url)
我们使用url选项来指定存档的位置。
如果我们运行构建,存档中的配置脚本将被执行。它创建一个make文件,该文件也将被执行
>>> print(system('bin/buildout').strip()) Installing foo. foo: Downloading https://#/foo.tgz foo: Unpacking and configuring configuring foo --prefix=/sample-buildout/parts/foo echo building foo building foo echo installing foo installing foo
配方还创建了部分目录
>>> import os.path >>> os.path.isdir(join(sample_buildout, "parts", "foo")) True
如果我们再次运行构建,将调用更新方法,但它不会做任何事情
>>> print(system('bin/buildout').strip()) Updating foo.
您可以提供额外的配置选项
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = foo ... ... [foo] ... recipe = zc.recipe.cmmi ... url = %sfoo.tgz ... extra_options = -a -b c ... """ % distros_url)>>> print(system('bin/buildout').strip()) Uninstalling foo. Installing foo. foo: Downloading https://#/foo.tgz foo: Unpacking and configuring configuring foo --prefix=/sample-buildout/parts/foo -a -b c echo building foo building foo echo installing foo installing foo
配方将位置选项设置为部分安装的位置,该选项可以被其他配方读取
>>> cat('.installed.cfg') [buildout] installed_develop_eggs = parts = foo <BLANKLINE> [foo] ... location = /sample_buildout/parts/foo ...
在运行配置或make时,可能需要设置一些环境变量。这可以通过添加环境语句来完成
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = foo ... ... [foo] ... recipe = zc.recipe.cmmi ... url = %sfoo.tgz ... environment = ... CFLAGS=-I/usr/lib/postgresql7.4/include ... """ % distros_url)>>> print(system('bin/buildout').strip()) Uninstalling foo. Installing foo. foo: Downloading https://#/foo.tgz foo: Unpacking and configuring foo: Updating environment: CFLAGS=-I/usr/lib/postgresql7.4/include configuring foo --prefix=/sample_buildout/parts/foo echo building foo building foo echo installing foo installing foo
在构建软件包之前,有时需要修补源代码。您可以指定要应用的补丁名称和(可选)补丁选项
首先,让我们编写一个补丁文件
>>> import sys >>> mkdir('patches') >>> write('patches/config.patch', ... """--- configure ... +++ /dev/null ... @@ -1,13 +1,13 @@ ... #!%s ... import sys ... -print("configuring foo " + ' '.join(sys.argv[1:])) ... +print("configuring foo patched " + ' '.join(sys.argv[1:])) ... ... Makefile_template = ''' ... all: ... -\techo building foo ... +\techo building foo patched ... ... install: ... -\techo installing foo ... +\techo installing foo patched ... ''' ... ... with open('Makefile', 'w') as f: ... _ = f.write(Makefile_template) ... ... """ % sys.executable)
现在,让我们创建一个buildout.cfg文件。注意:如果没有传递补丁选项,默认会追加-p0。
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = foo ... ... [foo] ... recipe = zc.recipe.cmmi ... url = %sfoo.tgz ... patch = ${buildout:directory}/patches/config.patch ... patch_options = -p0 ... """ % distros_url)>>> print(system('bin/buildout').strip()) Uninstalling foo. Installing foo. foo: Downloading https://#/foo.tgz foo: Unpacking and configuring patching file configure ... configuring foo patched --prefix=/sample_buildout/parts/foo echo building foo patched building foo patched echo installing foo patched installing foo patched
可以自动生成配置文件
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = foo ... ... [foo] ... recipe = zc.recipe.cmmi ... url = %s/bar.tgz ... autogen = autogen.sh ... """ % distros_url)>>> print(system('bin/buildout').strip()) Uninstalling foo. Installing foo. foo: Downloading https://#//bar.tgz foo: Unpacking and configuring foo: auto generating configure files configuring foo --prefix=/sample_buildout/parts/foo echo building foo building foo echo installing foo installing foo
还可以支持除“./configure”之外的其他配置命令
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = foo ... ... [foo] ... recipe = zc.recipe.cmmi ... url = %s/baz.tgz ... source-directory-contains = configure.py ... configure-command = ./configure.py ... configure-options = ... --bindir=bin ... """ % distros_url)>>> print(system('bin/buildout').strip()) Uninstalling foo. Installing foo. foo: Downloading https://#//baz.tgz foo: Unpacking and configuring configuring foo --bindir=bin echo building foo building foo echo installing foo installing foo
在下载源存档或补丁时,我们可以通过提供必须匹配的MD5校验和来选择性地确保其真实性。如果匹配,buildout的输出将不会打扰我们
>>> from hashlib import md5 >>> with open(join(distros, 'foo.tgz'), 'rb') as f: ... foo_md5sum = md5(f.read()).hexdigest()>>> write('buildout.cfg', ... """ ... [buildout] ... parts = foo ... ... [foo] ... recipe = zc.recipe.cmmi ... url = %sfoo.tgz ... md5sum = %s ... """ % (distros_url, foo_md5sum))>>> print(system('bin/buildout').strip()) Uninstalling foo. Installing foo. foo: Downloading https://#/foo.tgz foo: Unpacking and configuring configuring foo --prefix=/sample_buildout/parts/foo echo building foo building foo echo installing foo installing foo
但如果存档不匹配校验和,配方将拒绝安装
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = foo ... ... [foo] ... recipe = zc.recipe.cmmi ... url = %sbar.tgz ... md5sum = %s ... patch = ${buildout:directory}/patches/config.patch ... """ % (distros_url, foo_md5sum))>>> print(system('bin/buildout').strip()) Uninstalling foo. Installing foo. foo: Downloading https://#:20617/bar.tgz While: Installing foo. Error: MD5 checksum mismatch downloading 'https://#/bar.tgz'
类似地,补丁的校验和不匹配将导致构建运行中断
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = foo ... ... [foo] ... recipe = zc.recipe.cmmi ... url = %sfoo.tgz ... patch = ${buildout:directory}/patches/config.patch ... patch-md5sum = %s ... """ % (distros_url, foo_md5sum))>>> print(system('bin/buildout').strip()) Installing foo. foo: Downloading https://#:21669/foo.tgz foo: Unpacking and configuring While: Installing foo. Error: MD5 checksum mismatch for local resource at '/.../sample-buildout/patches/config.patch'.>>> write('buildout.cfg', ... """ ... [buildout] ... parts = foo ... ... [foo] ... recipe = zc.recipe.cmmi ... url = %sfoo.tgz ... patch = ${buildout:directory}/patches/config.patch ... """ % (distros_url))
如果构建失败,将记录tarball解压缩的临时目录到stdout,并保持不变以供调试目的
>>> write('patches/config.patch', "dgdgdfgdfg")>>> res = system('bin/buildout') >>> print(res) Installing foo. foo: Downloading https://#/foo.tgz foo: Unpacking and configuring patch unexpectedly ends in middle of line foo: cmmi failed: /.../...buildout-foo patch: **** Only garbage was found in the patch input. While: Installing foo. <BLANKLINE> An internal error occurred due to a bug in either zc.buildout or in a recipe being used: ... subprocess.CalledProcessError: Command 'patch -p0 < ...' returned non-zero exit status ... <BLANKLINE>>>> import re >>> import os.path >>> import shutil >>> path = re.search('foo: cmmi failed: (.*)', res).group(1) >>> os.path.exists(path) True >>> shutil.rmtree(path)
成功构建后,将删除此类临时目录
>>> import glob >>> import tempfile>>> old_tempdir = tempfile.gettempdir() >>> tempdir = tempfile.tempdir = tempfile.mkdtemp(suffix='.buildout.build') >>> dirs = glob.glob(os.path.join(tempdir, '*buildout-foo'))>>> write('buildout.cfg', ... """ ... [buildout] ... parts = foo ... ... [foo] ... recipe = zc.recipe.cmmi ... url = %sfoo.tgz ... """ % (distros_url,))>>> print(system("bin/buildout")) Installing foo. foo: Downloading https://#:21445/foo.tgz foo: Unpacking and configuring configuring foo --prefix=/sample_buildout/parts/foo echo building foo building foo echo installing foo installing foo <BLANKLINE>>>> new_dirs = glob.glob(os.path.join(tempdir, '*buildout-foo')) >>> len(dirs) == len(new_dirs) == 0 True >>> tempfile.tempdir = old_tempdir
下载缓存
配方支持使用与zc.buildout相同的下载缓存方式。有关详细信息,请参阅downloadcache.txt
项目详情
下载文件
为您的平台下载文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。