我将使用一个有代表性的例子来解释我的问题。
假设我有这两个配置文件:
# product-conf.file
seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical
product_id: general_id
title: general_title
intro: general_intro
# service-conf.file
seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical
service_id: general_id
title: general_title
products: list_products
如您所见,3个第一行(配置字段)完全相同。我实际上是在为这些文件使用YAML。我想在可维护文件中包含一些代码,并将它们包含在调用中。我需要一个预处理器。类似的东西:
# snippet-seo.file
seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical
# product-conf-master.file
@include snippet-seo
product_id: general_id
title: general_title
intro: general_intro
# service-conf-master.file
@include snippet-seo
service_id: general_id
title: general_title
products: list_products
预处理程序将读取/masters/*
中的所有主文件,参加所有调用并将其替换为/snippets/
中的相应代码段并将结果保存在/
我正在使用@
进行调用,但我可以选择适合所选预处理器的任何其他格式。我使用这种方式是因为它非常类似于SASS指令@extend
或@include
。
我能做到的最好和最简单的方法是什么?节点包将是我的首选。
答案 0 :(得分:0)
如果您不一定需要预处理文件,可以使用小型YAML处理程序解决此问题(您可以使用基于节点的编程来完成此操作)。
import ruamel.yaml
data = ruamel.yaml.round_trip_load(open('master.file'))
common = data['common']
for file_name in data:
if file_name == 'common':
continue
data_out = ruamel.yaml.comments.CommentedMap()
# you can leave out the following two lines of code if you do a safe_load()
# but you will lose the ordering in your output file
for k, v in common.items():
data_out[k] = v
for k, v in data[file_name].items():
data_out[k] = v
with open(file_name, 'w') as fp:
ruamel.yaml.round_trip_dump(data_out, stream=fp)
在文件master.file
中给出以下输入:
# YAML master file
common: &COMMON
seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical
product-conf.file:
<<: *COMMON
product_id: general_id
title: general_title
intro: general_intro
service-conf.file:
<<: *COMMON
service_id: general_id
title: general_title
products: list_products
运行程序会为您提供两个文件product-conf.file
::
seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical
product_id: general_id
title: general_title
intro: general_intro
和service-conf.file
:
seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical
service_id: general_id
title: general_title
products: list_products
也可以将三个部分放在单独的输入文件中,而不是组合文件中的值。
或者,如果您的真实输入文件不包含cpp
以特殊方式处理的任何内容,您可以执行以下操作:
cpp -P -include master.in -o service-conf.file service-conf.in
master.in
:
seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical
和service-conf.in
:
service_id: general_id
title: general_title
products: list_products
这给出了与前一个示例相同的service-conf.out
。 product-conf.in
当然会以同样的方式运作。
-P
的{{1}}选项抑制调试输出注释,cpp
包含参数,好像输入文件的第一行具有预处理器指令:
-include
您也可以明确说明并省略命令行选项。