ZCML编写zc.buildout的配方
项目描述
支持选项
该配方支持在多个不同的输出目录中安装多个不同的ZCML slug集合。这些集合在分组选项中指定,其中X是组中所有选项共享的公共前缀。
- X_zcml
zcml条目列表。必需。
格式
zcml := package ":" filename package := dottedname | dottedname "-" ( include_name )
文件名是完整指定的文件,例如 browser.zcml,而 include_name 是不带 .zcml 扩展名的相对部分,默认为 configure(最初它是对一系列可能性进行验证,但现在不再是这种情况)。如果没有指定文件名,则使用 include_name。
- X_location
一个相对路径,用于在 etc 目录下放置生成的 slugs。必需。
- X_file
如果所有或大多数 zcml 条目都具有相同的 include_name,则这是一个方便的快捷方式。将此选项设置为默认值,而不是 configure。可选。
- X_features
如果提供了此可选指令,则它是一个空格和换行符分隔的 ZCML 功能列表,应在处理输出目录时提供。这些在第一个文件中提供。
有两个全局选项
- deployment
一个包含目录定义的 zc.recipe.deployment 部分的名称。我们将使用此部分中定义的 etc-directory 作为位置的基准。
- etc-directory
如果您没有指定 deployment,则此值将用作 etc 目录。
示例用法
我们将首先创建一个使用该菜谱的 buildout。我们将列出我们想要为其创建 slugs 的三个包(* 用于向后兼容性被忽略),以及我们想要提供的功能集
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = test1 ... ... [test1] ... recipe = nti.recipes.zcml ... etc-directory = ${buildout:directory}/zope/etc ... package_location = package-includes ... package_features = foo bar ... baz ... package_zcml = ... * ... my.package ... somefile:my.otherpackage ... my.thirdpackage-meta ... """)
运行 buildout 给我们
>>> print(system(buildout)) Installing test1. While: Installing test1. Error: The parents of '/.../sample-buildout/zope/etc/package-includes' do not exist
我们需要有一个有效的 etc 目录。让我们创建一个
>>> mkdir("zope") >>> mkdir("zope", "etc") >>> print(system(buildout)) Installing test1.
我们现在有一个包包含目录
>>> ls("zope", "etc") d package-includes
它确实包含 ZCML slugs
>>> ls("zope", "etc", "package-includes") - 000-features.zcml - 001-my.package-configure.zcml - 002-somefile-configure.zcml - 003-my.thirdpackage-meta.zcml
这些文件包含通常的内容
>>> cat("zope", "etc", "package-includes", "000-features.zcml") <configure xmlns="http://namespaces.zope.org/zope" xmlns:meta="http://namespaces.zope.org/meta"> <meta:provides feature="foo" /> <meta:provides feature="bar" /> <meta:provides feature="baz" /> </configure> >>> cat("zope", "etc", "package-includes", "001-my.package-configure.zcml") <include package="my.package" file="configure.zcml" /> >>> cat("zope", "etc", "package-includes", "002-somefile-configure.zcml") <include package="somefile" file="my.otherpackage" /> >>> cat("zope", "etc", "package-includes", "003-my.thirdpackage-meta.zcml") <include package="my.thirdpackage" file="meta.zcml" />
错误和边缘情况
现在我们将讨论如何处理各种边缘情况和错误。
没有 ZCML 和没有功能
如果您没有指定任何 ZCML 或功能,则不会生成任何文件(请注意,我们正在使用新的部分名称,这会导致旧的部分被卸载)
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = zcml ... ... [zcml] ... recipe = nti.recipes.zcml ... etc-directory = ${buildout:directory}/zope/etc ... package_location = empty-includes ... package_features = ... package_zcml = ... """) >>> print(system(buildout)) Uninstalling test1. Installing zcml. <BLANKLINE>
为该部分不会创建目录,当旧的部分被卸载时,它留下了它的目录,但没有文件
>>> ls("zope", "etc") d package-includes >>> ls("zope", "etc", "package-includes")
使用部署引用
如上所述,我们可以使用 zc.recipe.deployment 部分来查找 etc 目录(实际上,我们可以接受任何具有 etc-directory 设置的部分);这将覆盖任何本地指定的 etc-directory。我们尚未创建我们指定的目录(我们也没有使用 zc.recipe.deployment 来自动执行此操作),因此此 buildout 将失败
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = zcml ... ... [deployment-settings] ... etc-directory = ${buildout:directory}/zope/deployment-etc ... ... [zcml] ... recipe = nti.recipes.zcml ... deployment = deployment-settings ... etc-directory = ${buildout:directory}/zope/etc ... package_location = empty-includes ... package_features = foo ... package_zcml = ... """) >>> print(system(buildout)) Uninstalling zcml. Installing zcml. While: Installing zcml. Error: The parents of '/.../zope/deployment-etc/empty-includes' do not exist <BLANKLINE>
损坏的包名称
如果包名称损坏(尽管目前只能检测到最严重的违规行为),则会引发错误
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = zcml ... ... [zcml] ... recipe = nti.recipes.zcml ... etc-directory = ${buildout:directory}/zope/etc ... package_location = empty-includes ... package_zcml = $not_valid ... """) >>> print(system(buildout)) Installing zcml. While: Installing zcml. Error: Invalid package name: '$not_valid' parsed as '$not_valid' <BLANKLINE>
指定文件名两次
我们可以为单个条目指定 include_name 和 filename
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = zcml ... ... [zcml] ... recipe = nti.recipes.zcml ... etc-directory = ${buildout:directory}/zope/etc ... package_location = package-includes ... package_zcml = my.package-foo:filename.zcml ... """) >>> print(system(buildout)) Installing zcml. >>> ls("zope", "etc", "package-includes") - 001-my.package-foo.zcml >>> cat("zope", "etc", "package-includes", "001-my.package-foo.zcml") <include package="my.package" file="filename.zcml" />
变更
1.0.0 (2017-09-18)
初始公共发布。
项目详情
nti.recipes.zcml-1.0.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 336307d0d32b008b89fdbca777a07908aee52c1164b93948fc22c2310a97578e |
|
MD5 | be5e519eeff00a82a3e472886036979d |
|
BLAKE2b-256 | dc1cd05722b23a3e08958ab721bf6302e7dbfc465e2ae2db3929d6e077c359dd |
nti.recipes.zcml-1.0.0-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1a094f845be08797a1da8eea1388f7fbe9f1369acb27681c5ce4e00659ed6ba5 |
|
MD5 | 388e4e8b416eb7804c181e0399cc2dd4 |
|
BLAKE2b-256 | a2bd7f073d6cc102e67b3bcd19be49f55db1f4012d473bf2ae4a45481055ed96 |