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

Jam*_*sen 39 yaml assets ruby-on-rails jammit

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

我试过这个:

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

mobile:
  <<: *SAMMY
  - public/javascripts/something_else.js
Run Code Online (Sandbox Code Playgroud)

还有这个:

mobile:
  - *SAMMY
Run Code Online (Sandbox Code Playgroud)

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

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

yng*_*gve 26

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

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

mobile:
  - *SAMMY1
  - *SAMMY2
  - public/javascripts/something_else.js
Run Code Online (Sandbox Code Playgroud)

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

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


Jes*_*der 19

你的例子是有效的YAML(一个方便的检查位置是YPaste),但它没有定义合并的作用.根据规范,合并键可以具有值:

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

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

mobile:
  - *SAMMY
Run Code Online (Sandbox Code Playgroud)

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

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

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


sep*_*p2k 17

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

mobile: *SAMMY
Run Code Online (Sandbox Code Playgroud)

但是,如果你想要mobile包含除了那些元素之外的其他元素sammy,那么就我所知,在YAML中无法做到这一点.