从文件模板创建文件的zc.buildout方法
as.recipe.filetemplate的Python项目详细描述
基本用法
使用 as.recipe.filetemplate构建配方,您可以自动执行 从模板生成文本文件。执行死刑后, 配方将读取多个模板文件,执行变量 替换并将结果写入相应的输出文件。
这个配方有几个特性,但它总是使用带有 。在 后缀中,处理模板,并将文件写入所需的 具有相同文件模式和相同名称但没有 的位置。 后缀. < /P>
例如,考虑这个文本文件的简单模板:
< Buff行情>>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)
现在让我们创建一个构建配置,以便我们可以替换 此文件中的值。我们要做的就是定义一个使用 as.recipe.filetemplate 配方。使用 文件 参数 我们指定一个或多个需要替换的文件(用 空白)。然后,我们可以向部分添加任意参数。 这些将用于填充模板中的变量:
< Buff行情>>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = message ... ... [message] ... recipe = as.recipe.filetemplate ... files = helloworld.txt ... world = Philipp ... """)
在执行buildout之后,我们可以看到 ${world} 确实 替换为Philipp < Buff行情>
>>> print system(buildout) Installing message.
>>> cat(sample_buildout, 'helloworld.txt') Hello Philipp!
如果需要转义${…}模式,可以通过重复使用美元 符号。 < Buff行情>
>>> update_file(sample_buildout, 'helloworld.txt.in', ... """ ... Hello world! The double $${dollar-sign} escapes! ... """)
>>> print system(buildout) Uninstalling message. Installing message.
>>> cat(sample_buildout, 'helloworld.txt') Hello world! The double ${dollar-sign} escapes!
请注意,不带大括号的美元符号本身不会被解析。
< Buff行情>>>> update_file(sample_buildout, 'helloworld.txt.in', ... """ ... $Hello $$world! $$$profit! ... """)
>>> print system(buildout) Uninstalling message. Installing message.
>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)0
注意,输出文件使用与输入文件相同的权限位 文件
< Buff行情>>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)1
默认情况下,配方查找相对于构建根的 文件中的 。 并将其放置在相对于构建根目录的同一文件夹中。然而,如果 你不想把目标文件夹弄乱,你可以添加一个前缀到 源文件夹。下面是一个例子。
首先,我们在构建中指定一个源目录。您可以指定 文件 作为过滤器(如果需要),但默认情况下它会找到任何文件(结束 带".in")。如果需要,还可以指定排除目录选项 从源目录中排除一些路径。
< Buff行情>>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)2
现在我们将创建一个"template"目录,如buildout配置中所列 在上面,为我们的示例填充它。
< Buff行情>>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)3
注意,在运行buildout之前,helloworld.txt文件仍然是 我们没有etc目录,bin目录没有 helloworld.sh
< Buff行情>>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)4
现在我们安装。旧的"helloworld.txt"已经不见了,我们现在看到了etc.note 对于目标,如果中间文件夹没有 存在。
< Buff行情>>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)5
文件已经存在,并且具有我们期望的内容。
< Buff行情>>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)6
如果将 文件 选项与 源目录一起使用,则它将成为 过滤器。每个目标文件必须至少与 文件 中的一个名称匹配。 因此,如果我们只构建.sh文件,etc目录将消失。
< Buff行情>>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)7
>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)8
>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)9
还要注意,如果使用源目录和 文件,请指定 目录,目录必须精确匹配。
使用 exclude directories参数,我们指定一个或多个目录 (用空格分隔)其中配方将不查找模板 文件夹。"排除目录"选项应与 源目录选项。 因此,如果我们设置 排除目录 bin/helloworld.sh 文件将消失。
< Buff行情>>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = message ... ... [message] ... recipe = as.recipe.filetemplate ... files = helloworld.txt ... world = Philipp ... """)0
>>> write(sample_buildout, 'helloworld.txt.in', ... """ ... Hello ${world}! ... """)5
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = message ... ... [message] ... recipe = as.recipe.filetemplate ... files = helloworld.txt ... world = Philipp ... """)2
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = message ... ... [message] ... recipe = as.recipe.filetemplate ... files = helloworld.txt ... world = Philipp ... """)3
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = message ... ... [message] ... recipe = as.recipe.filetemplate ... files = helloworld.txt ... world = Philipp ... """)4