有没有办法在YAML中对数组进行别名/锚定?
我正在使用Jammit将资产打包为Rails应用程序,并且我有一些资产文件,我希望将其包含在几个组中。 例如,我希望Sammy及其插件可以同时包含在我的mobile
和screen
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。 根据规范 ,合并键可以具有值:
- 映射,在这种情况下,它合并到父映射中。
- 映射序列,在这种情况下,每个映射都将一个接一个地合并到父映射中。
没有合并序列的方法。 但是,您可以在代码中执行此操作。 使用你的第二个想法中的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。