2011-02-09 104 views
23

我正在使用Jammit为Rails应用程序打包资产,并且我有几个资产文件可以包含在几个组中。例如,我想Sammy及其插件都在我的mobilescreen JS包中。有没有办法在YAML中别名/锚定数组?

我已经试过这样:

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

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

这:

mobile: 
    - *SAMMY 

但无论把萨米JS文件嵌套数组中,这Jammit无法理解。是否有将数组的元素直接包含在另一个数组中的语法?

NB:我意识到,在这种情况下,只有两个在SAMMY数组元素,所以它不会太差给每一个别名和参考无论是在每个包。对于这种情况,这很好,但如果有五个或十个具有特定加载顺序的元素,则很快就会无法维护。

回答

12

你的例子是有效的YAML(一个方便的地方检查是YPaste),但它没有定义什么合并。每spec,合并键可以有一个值:

  1. 的映射,在这种情况下,它合并到父映射。
  2. 一系列映射,在这种情况下,每个映射都逐个合并到父映射中。

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

mobile: 
    - *SAMMY 

你会得到嵌套序列 - 所以他们压平!假设你有这样的嵌套序列的映射:

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

(当然,如果你有一个更复杂的YAML文件,你不希望每一个序列变平(或他们不是所有序列),你必须做一些过滤。)

+0

这里有一个例子:http://www.yaml.org/ypaste/803/index.html我只是检查了一遍,发现它不是一个语法错误,这是这个结构不会产生平坦的复苏法案。 Ÿ;它会创建一张Jammit无法处理的地图。我刚刚编辑了这个问题来表明这一点。 – 2011-02-09 19:23:07

+0

@詹姆斯,对不起,我不太明白你是合并序列。编辑。 – 2011-02-09 19:58:15

11

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

mobile: *SAMMY 

但是如果你想要mobile包含除了那些在sammy等元素,有没有办法做到这一点在YAML尽我所知。

2

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

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

10

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

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

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

此外,作为已经建议,压平嵌套列表中的代码片段。

注:根据yaml-online-parser,你的第一个建议是不是< <有效利用(用于从两个库合并键锚然后有指向另一个字典相信

0

因为已经。建议,当你需要拼合的列表,至少在Ruby中,它是微不足道的!“扁平化”类型说明符添加到移动和实现扩展阵列类,增加了yaml_tag和平坦化上init_with的编码序列。

相关问题