68

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

我试过这个:

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数组中只有两个元素,所以给每个元素一个别名并在每个包中都引用并不会太糟糕。在这种情况下这很好,但是当有五个或十个元素具有特定的加载顺序时,很快就会变得无法维护。

4

5 回答 5

47

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

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

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

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

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

于 2014-11-19T16:45:31.540 回答
33

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

mobile: *SAMMY

但是,如果您想mobile包含除sammy.

于 2011-02-09T18:45:33.517 回答
32

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

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

没有办法在 YAML 级别合并序列

但是,您可以在代码中执行此操作。使用第二个想法中的 YAML:

mobile:
  - *SAMMY

你会得到嵌套的序列——所以把它们展平!假设您有这样的嵌套序列的映射:

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

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

于 2011-02-09T18:51:08.683 回答
0

此解决方案仅适用于 Symfony/PHP(其他语言的注意事项,见下文)

注意PHP 数组手册页中的数组键:

包含有效十进制整数的字符串,除非数字前面有 + 号,否则将被强制转换为 int 类型。例如,密钥“8”实际上将存储在 8 之下。 [...]

这意味着如果您实际上使用整数键索引您的锚数组,您可以通过继续初始列表来简单地添加新键。所以你的解决方案看起来像这样:

sammy: &SAMMY
  1: public/javascripts/vendor/sammy.js
  2: public/javascripts/vendor/sammy*.js

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

您甚至可以覆盖密钥并仍然添加新密钥:

laptop:
  <<: *SAMMY
  1: public/javascripts/sammy_laptop.js
  3: public/javascripts/something_else.js

在这两种情况下,最终结果都是一个完全有效的索引数组,就像以前一样。


其他编程语言

根据您的 YAML 实现以及您对数组的迭代方式,可以想象这也可以用于其他编程语言。虽然有一个警告。

例如,在 JS 中,您也可以通过整数值访问数字字符串键:

const sammy = {"1": "public/javascripts/vendor/sammy.js"}

sammy["1"]; // "public/javascripts/vendor/sammy.js"
sammy[1]; // "public/javascripts/vendor/sammy.js"

但是您需要记住,您的初始数组现在是一个 object,并且您需要相应地对其进行迭代,例如:

Object.keys(sammy).forEach(key => console.log(sammy[key]))
于 2021-04-26T10:51:54.573 回答
-2

正如建议的那样,当您需要展平列表时,至少在 ruby​​ 中,向移动设备添加“!flatten”类型说明符并实现扩展 Array 的类,添加 yaml_tag 并将编码器序列展平是微不足道的init_with。

于 2016-07-28T06:26:15.413 回答