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

Jekyll Include one YAML file in another YAML file

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

我尝试过的事情:

编辑 - 用法示例

在多个视图中使用通用数据文件对我来说还不够,因为还需要 liquid 中的名称解析逻辑来配合它。这是我的数据的示例:

A.yml

ingredients:
  - avacado: &avacado
      name: Avacado
      color: Green
      foods:
        - *octopus_ceviche

B.yml

chefs:
  - anthony_bourdain: &anthony_bourdain
      name: Anthony Bourdain
      hobby: Brazilian Jiu-Jitsu
      foods:
        - *octopus_ceviche

C.yml

foods:
  - octopus_ceviche: &octopus_ceviche
      name: Octopus Ceviche
      taste: Delicious

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

由于 Jekyll 在加载数据文件时不会使用 Liquid 处理数据文件,因此无法使用 {% include %} 将一个 YAML 文件包含在另一个文件中。 YAML本身没有包含其他文件的能力(因为它是stream-based,而不是file-based)。

不过,应该没有必要。如果将所有公共变量移动到 C.yml,您可以通过 HTML 文件中的 {{ site.data.C.myvar }} 访问它们,不需要在 A.yml 或 [=14] 中包含任何内容=].

要有一个通用的 key-value 变量列表,请定义第三个数据文件 _data/common.yml

然后在 A.htmlB.html 中,您可以访问所有 common.yml 变量:

 {{ site.data.common.myvar }}

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

*octupus_ceviche 是一个 YAML 别名,与 Liquid 无关。正如我所说,YAML 文件不使用 Liquid 进行处理。但是,YAML 定义别名必须指向同一文档中的 achors。一个 YAML 文档必须驻留在一个 stream 中,这对于大多数 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

如果它们的子键像本例中那样不相交,您可以省略 ABC。但是请注意,即使 YAML 定义映射键没有顺序,锚点也必须始终位于别名(文本)之前。这就是为什么我把 C 移到前面的原因。

Nota Bene: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 的答案是最合适的,但是考虑到外部限制(参见 ) I ended writing my own plugin 让数据文件通过 liquid 在文本上相互包含。

这个插件的目标是让数据成为:

  1. DRY -(不要重复自己)每个模型应该只定义一次。
  2. 分组 - 所有类似的数据都应该以相同的格式彼此相邻定义。
  3. 分开 - 不同的数据应该在不同的地方定义。

@flyx 的解决方案未能实现目标 #2 和 #3,要求在同一位置定义所有不同类型的数据,并且在第二个建议的情况下混合食品和成分的定义。

我提出的解决方案允许将一个数据文件文本包含到另一个文件中。这允许在不同的文件中定义不同的模型,但从其他文件中引用它们就像它们以任意顺序在同一位置定义一样。应用于这个问题,我的解决方案是这样的:

A.yml

{% include_relative_once C.yml %}

 ingredients:
  - avacado: &avacado
      name: Avacado
      color: Green
      foods:
        - *octopus_ceviche

B.yml

{% include_relative_once C.yml %}

chefs:
  - anthony_bourdain: &anthony_bourdain
      name: Anthony Bourdain
      hobby: Brazilian Jiu-Jitsu
      foods:
        - *octopus_ceviche

C.yml

foods:
  - octopus_ceviche: &octopus_ceviche
      name: Octopus Ceviche
      taste: Delicious

对于插件本身,请参阅此 gist