有没有办法在YAML中对数组进行别名/锚定?

我正在使用Jammit将资产打包为Rails应用程序,并且我有一些资产文件,我希望将其包含在几个组中。 例如,我希望Sammy及其插件可以同时包含在我的mobilescreen JS包中。

我试过这个:

 sammy: &SAMMY - public/javascripts/vendor/sammy.js - public/javascripts/vendor/sammy*.js mobile: <<: *SAMMY - public/javascripts/something_else.js 

还有这个:

 mobile: - *SAMMY 

但两者都把Sammy JS文件放在嵌套数组中,Jammit无法理解。 是否有将Array的元素直接包含在另一个Array中的语法?

注意 :我意识到在这种情况下SAMMY数组中只有两个元素,所以在每个包中给每个元素一个别名和引用都不会太糟糕。 这种情况很好,但是当有五个或十个具有特定加载顺序的元素时,很快就无法维护。

您的示例是有效的YAML(一个方便的检查位置是YPaste ),但它没有定义合并的function。 根据规范 ,合并键可以具有值:

  1. 映射,在这种情况下,它合并到父映射中。
  2. 映射序列,在这种情况下,每个映射都将一个接一个地合并到父映射中。

没有合并序列的方法。 但是,您可以在代码中执行此操作。 使用你的第二个想法中的YAML:

 mobile: - *SAMMY 

你会得到嵌套的序列 – 所以压扁它们! 假设您有这种嵌套序列的映射:

 data = YAML::load(File.open('test.yaml')) data.each_pair { |key, value| value.flatten! } 

(当然,如果你有一个更复杂的YAML文件,并且你不希望每个序列变平(或者它们不是所有序列),你将不得不进行一些过滤。)

我所知道的最近的解决方案就是这个:

 sammy: - &SAMMY1 public/javascripts/vendor/sammy.js - &SAMMY2 public/javascripts/vendor/sammy*.js mobile: - *SAMMY1 - *SAMMY2 - public/javascripts/something_else.js 

或者,如已建议的那样,将嵌套列表展平在代码段中。

注意:根据yaml-online-parser ,你的第一个建议不是<<的有效用法(用于合并来自两个词典的键。锚点然后必须指向我相信的另一个词典。

如果你想让mobile等同于sammy ,你可以这样做:

 mobile: *SAMMY 

但是,如果你希望mobile除了包含在sammy其他元素之外还包含其他元素,那么就我所知,在YAML中无法做到这一点。

这应该可以解决您的问题: http : //pastie.org/1790173 。

请注意,我必须在顶部创建空白default (或任何名称)组。

正如有人建议的那样,当你需要压缩列表时,至少在ruby中,向移动添加“!flatten”类型说明符并实现扩展Array的类是非常简单的,添加yaml_tag并展平编码器seq on init_with。