我有一个Jekyll项目,其中两个单独的页面(A.html和B.html)分别根据YAML文件A.yml和B.yml中的数据显示不同的内容。每个yml文件都有一堆相同定义的变量。我更喜欢将这个常见的变量列表保存在第三个文件C.yml中,并将其包含在A.yml和B.yml中。我怎么能这样做?
我尝试过的事情:
*site.data.C.vars
这样的全局数据 - 这不会解析。{% include C.yml %}
- 这已编译,但发出的html页面没有任何内容。在多个视图中使用公共数据文件对我来说还不够,因为还需要在液体中配置名称解析逻辑。以下是我的数据可能的示例:
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)对于视图感觉太多逻辑。 / p>
答案 0 :(得分:3)
要有一个共同的键值变量列表,请定义第三个数据文件b1 = b1
。
然后在_data/common.yml
和A.html
中,您可以访问所有B.html
变量:
common.yml
答案 1 :(得分:2)
基于编辑过的问题的新答案:
*octupus_ceviche
是YAML 别名,与Liquid无关。正如我所说,YAML文件不是用Liquid处理的。但是,YAML定义别名必须指向同一文档中的 achors 。一个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
移到前面的原因。
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
但当然这可读性较差。因人而异。
答案 2 :(得分:1)
由于Jekyll在加载数据时不使用Liquid处理数据文件,因此无法在{% include %}
的另一个YAML文件中包含一个YAML文件。 YAML本身无法包含其他文件(因为它是基于流的,而不是基于文件的。)
但是,它没有必要。如果您将所有常见变量移至C.yml
,则只需在两个HTML文件中通过{{ site.data.C.myvar }}
访问它们,而无需在A.yml
或B.yml
中包含任何内容。< / p>
答案 3 :(得分:0)
由于上述问题的措辞,@ flyx是最合适的答案,但是考虑到外部约束(参见my other question),我结束了自己的plugin,让数据文件通过液体文本互相包含
此插件的目标是让数据为:
@ 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