跳转到主要内容

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_namefilename

>>> 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 (8.4 kB 查看哈希值)

上传时间

构建分发版

nti.recipes.zcml-1.0.0-py2.py3-none-any.whl (12.3 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者