Jekyll在另一个YAML文件中包含一个YAML文件

Jekyll在另一个YAML文件中包含一个YAML文件,yaml,jekyll,liquid,Yaml,Jekyll,Liquid,我有一个Jekyll项目,其中两个单独的页面(a.html和B.html)分别基于YAML文件a.yml和B.yml中的数据显示不同的内容。每个yml文件都有一组定义相同的变量。我更愿意将这个通用变量列表保存在第三个文件C.yml中,并将其包含在a.yml和B.yml中。我该怎么做 我尝试过的事情: 使用*引用全局数据,如*site.data.C.vars——这没有解析 将C.yml放入_includes目录并使用front matter将页面视为液体模板,并调用{%includes C.ym

我有一个Jekyll项目,其中两个单独的页面(a.html和B.html)分别基于YAML文件a.yml和B.yml中的数据显示不同的内容。每个yml文件都有一组定义相同的变量。我更愿意将这个通用变量列表保存在第三个文件C.yml中,并将其包含在a.yml和B.yml中。我该怎么做

我尝试过的事情:

  • 使用*引用全局数据,如
    *site.data.C.vars
    ——这没有解析
  • 将C.yml放入_includes目录并使用front matter将页面视为液体模板,并调用
    {%includes C.yml%}
    -此已编译,但发出的html页面没有任何内容
编辑示例用法 在多个视图中使用公共数据文件对我来说还不够,因为还需要液体中的名称解析逻辑来伴随它。下面是我的数据的示例:

A.yml

ingredients:
  - avacado: &avacado
      name: Avacado
      color: Green
      foods:
        - *octopus_ceviche
chefs:
  - anthony_bourdain: &anthony_bourdain
      name: Anthony Bourdain
      hobby: Brazilian Jiu-Jitsu
      foods:
        - *octopus_ceviche
foods:
  - octopus_ceviche: &octopus_ceviche
      name: Octopus Ceviche
      taste: Delicious
{% include_relative_once C.yml %}

 ingredients:
  - avacado: &avacado
      name: Avacado
      color: Green
      foods:
        - *octopus_ceviche
{% include_relative_once C.yml %}

chefs:
  - anthony_bourdain: &anthony_bourdain
      name: Anthony Bourdain
      hobby: Brazilian Jiu-Jitsu
      foods:
        - *octopus_ceviche
foods:
  - octopus_ceviche: &octopus_ceviche
      name: Octopus Ceviche
      taste: Delicious
B.yml

ingredients:
  - avacado: &avacado
      name: Avacado
      color: Green
      foods:
        - *octopus_ceviche
chefs:
  - anthony_bourdain: &anthony_bourdain
      name: Anthony Bourdain
      hobby: Brazilian Jiu-Jitsu
      foods:
        - *octopus_ceviche
foods:
  - octopus_ceviche: &octopus_ceviche
      name: Octopus Ceviche
      taste: Delicious
{% include_relative_once C.yml %}

 ingredients:
  - avacado: &avacado
      name: Avacado
      color: Green
      foods:
        - *octopus_ceviche
{% include_relative_once C.yml %}

chefs:
  - anthony_bourdain: &anthony_bourdain
      name: Anthony Bourdain
      hobby: Brazilian Jiu-Jitsu
      foods:
        - *octopus_ceviche
foods:
  - octopus_ceviche: &octopus_ceviche
      name: Octopus Ceviche
      taste: Delicious
C.yml

ingredients:
  - avacado: &avacado
      name: Avacado
      color: Green
      foods:
        - *octopus_ceviche
chefs:
  - anthony_bourdain: &anthony_bourdain
      name: Anthony Bourdain
      hobby: Brazilian Jiu-Jitsu
      foods:
        - *octopus_ceviche
foods:
  - octopus_ceviche: &octopus_ceviche
      name: Octopus Ceviche
      taste: Delicious
{% include_relative_once C.yml %}

 ingredients:
  - avacado: &avacado
      name: Avacado
      color: Green
      foods:
        - *octopus_ceviche
{% include_relative_once C.yml %}

chefs:
  - anthony_bourdain: &anthony_bourdain
      name: Anthony Bourdain
      hobby: Brazilian Jiu-Jitsu
      foods:
        - *octopus_ceviche
foods:
  - octopus_ceviche: &octopus_ceviche
      name: Octopus Ceviche
      taste: Delicious

如果没有办法将C.yml包含在A和B中,那么所有的食物都需要在这两个地方共享。如果在md/html页面中使用了食物,则需要通过直接哈希访问(例如,
{{site.data.foods[octopus_ceviche]}
)来访问条目,这a)似乎不起作用,b)对于视图来说似乎太多逻辑。

因为Jekyll在加载数据文件时不使用液体处理数据文件,无法使用
{%include%}
将一个YAML文件包含在另一个YAML文件中。YAML本身不能包含其他文件(因为它是基于流的,而不是基于文件的)


然而,这不应该是必要的。如果您将所有公共变量移动到
C.yml
,您可以通过
{{site.data.C.myvar}}
在两个HTML文件中访问它们,并且不需要在
A.yml
B.yml
中包含任何内容,因为Jekyll在加载数据文件时不使用液体处理数据文件,无法使用
{%include%}
将一个YAML文件包含在另一个YAML文件中。YAML本身不能包含其他文件(因为它是基于流的,而不是基于文件的)


然而,这不应该是必要的。如果您将所有公共变量移动到
C.yml
,您只需通过两个HTML文件中的
{site.data.C.myvar}
访问它们,而不需要在
A.yml
B.yml

中包含任何内容,就可以让键值变量的公共列表定义第三个数据文件
\u data/common.yml

然后,在
A.html
B.html
中,您可以通过以下方式访问所有
common.yml
变量:

 {{ site.data.common.myvar }}

要拥有键值变量的公共列表,请定义第三个数据文件
\u data/common.yml

然后,在
A.html
B.html
中,您可以通过以下方式访问所有
common.yml
变量:

 {{ site.data.common.myvar }}

基于已编辑问题的新答案:


*octupus_ceviche
是YAML的别名,与液体无关。正如我所说,YAML文件不是用液体处理的。但是,YAML定义别名必须指向同一文档中的achor。一个YAML文档必须驻留在一个流中,这对于大多数YAML处理器来说意味着它不能拆分为多个文件

也就是说,一个有效的选择是将所有数据放在一个YAML文件中:

C:
  foods:
    - octopus_ceviche: &octopus_ceviche
        name: Octopus Ceviche
        taste: Delicious
A:
  ingredients:
    - avacado: &avacado
        name: Avacado
        color: Green
        foods:
          - *octopus_ceviche
B:
  chefs:
    - anthony_bourdain: &anthony_bourdain
        name: Anthony Bourdain
        hobby: Brazilian Jiu-Jitsu
        foods:
          - *octopus_ceviche
如果
A
B
C
的子键与本例中的子键不相交,则可以省略它们。但是请注意,锚点必须始终位于别名前面(文本),即使YAML定义映射键没有顺序。这就是为什么我在前面移动了
C

注:YAML中的锚和别名设计用于序列化循环结构。使用它们作为命名的、可重用的值通常是好的。但实际上,您不需要一个包含所有已定义“变量”的列表,您也可以在第一次出现时定义它们。例如:

A:
  ingredients:
    - avocado: &avocado
        name: Avocado
        color: Green
        foods:
          - &octopus_ceviche
            name: Octopus Ceviche
            taste: Delicious
B:
  chefs:
    - anthony_bourdain: &anthony_bourdain
        name: Anthony Bourdain
        hobby: Brazilian Jiu-Jitsu
        foods:
          - *octopus_ceviche

但这当然不太容易理解。ymmv.

基于编辑的问题的新答案:


*octupus_ceviche
是YAML的别名,与液体无关。正如我所说,YAML文件不是用液体处理的。但是,YAML定义别名必须指向同一文档中的achor。一个YAML文档必须驻留在一个流中,这对于大多数YAML处理器来说意味着它不能拆分为多个文件

也就是说,一个有效的选择是将所有数据放在一个YAML文件中:

C:
  foods:
    - octopus_ceviche: &octopus_ceviche
        name: Octopus Ceviche
        taste: Delicious
A:
  ingredients:
    - avacado: &avacado
        name: Avacado
        color: Green
        foods:
          - *octopus_ceviche
B:
  chefs:
    - anthony_bourdain: &anthony_bourdain
        name: Anthony Bourdain
        hobby: Brazilian Jiu-Jitsu
        foods:
          - *octopus_ceviche
如果
A
B
C
的子键与本例中的子键不相交,则可以省略它们。但是请注意,锚点必须始终位于别名前面(文本),即使YAML定义映射键没有顺序。这就是为什么我在前面移动了
C

注:YAML中的锚和别名设计用于序列化循环结构。使用它们作为命名的、可重用的值通常是好的。但实际上,您不需要一个包含所有已定义“变量”的列表,您也可以在第一次出现时定义它们。例如:

A:
  ingredients:
    - avocado: &avocado
        name: Avocado
        color: Green
        foods:
          - &octopus_ceviche
            name: Octopus Ceviche
            taste: Delicious
B:
  chefs:
    - anthony_bourdain: &anthony_bourdain
        name: Anthony Bourdain
        hobby: Brazilian Jiu-Jitsu
        foods:
          - *octopus_ceviche

但这当然不太容易理解。ymmv.

如上所述,@flyx是最合适的答案,但考虑到外部限制(请参阅),我结束了自己的写作,让数据文件通过文本方式相互包含

此插件的目标是让数据:

  • 干式-(不要重复自己)每个模型只应定义一次
  • 分组-所有相似的数据应以相同的格式彼此相邻定义
  • 分离-应在不同的位置定义不同的数据
  • @flyx在这里的解决方案没有达到目标2和3,要求在同一个地方定义所有不同类型的数据,第二个建议混合了食品和英格里丁的定义