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 中。我该怎么做?
我尝试过的事情:
- 使用 * 来引用全局数据,例如
*site.data.C.vars
- 这没有解析。
- 将 C.yml 放入 _includes 目录并使用 front matter 将页面视为液体模板并调用
{% include C.yml %}
- 这已编译,但发出的 html 页面没有任何内容。
编辑 - 用法示例
在多个视图中使用通用数据文件对我来说还不够,因为还需要 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.html
和 B.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
如果它们的子键像本例中那样不相交,您可以省略 A
、B
和 C
。但是请注意,即使 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 在文本上相互包含。
这个插件的目标是让数据成为:
- DRY -(不要重复自己)每个模型应该只定义一次。
- 分组 - 所有类似的数据都应该以相同的格式彼此相邻定义。
- 分开 - 不同的数据应该在不同的地方定义。
@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
我有一个 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 将页面视为液体模板并调用
{% include C.yml %}
- 这已编译,但发出的 html 页面没有任何内容。
编辑 - 用法示例
在多个视图中使用通用数据文件对我来说还不够,因为还需要 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.html
和 B.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
如果它们的子键像本例中那样不相交,您可以省略 A
、B
和 C
。但是请注意,即使 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 的答案是最合适的,但是考虑到外部限制(参见
这个插件的目标是让数据成为:
- DRY -(不要重复自己)每个模型应该只定义一次。
- 分组 - 所有类似的数据都应该以相同的格式彼此相邻定义。
- 分开 - 不同的数据应该在不同的地方定义。
@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