使用其他文件的内容预处理(填充,生成)文件

时间:2016-03-17 16:28:56

标签: node.js npm yaml preprocessor populate

我将使用一个有代表性的例子来解释我的问题。

假设我有这两个配置文件:

# 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

我能做到的最好和最简单的方法是什么?节点包将是我的首选。

1 个答案:

答案 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.outproduct-conf.in当然会以同样的方式运作。

-P的{​​{1}}选项抑制调试输出注释,cpp包含参数,好像输入文件的第一行具有预处理器指令:

-include

您也可以明确说明并省略命令行选项。