web-dev-qa-db-ja.com

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

しかしどちらも、Jammitが理解できないネストされた配列にSammy JSファイルを配置します。配列の要素を別の配列に直接含めるための構文はありますか?

[〜#〜] nb [〜#〜]:この場合、SAMMY配列には2つの要素しかないことがわかりますなので、各パッケージにエイリアスと参照の両方を与えることは悪くありません。この場合は問題ありませんが、特定の読み込み順序を持つ要素が5つまたは10個ある場合、すぐにメンテナンスできなくなります。

45
James A. Rosen

あなたの例は有効なYAML(チェックするのに便利な場所は YPaste )ですが、マージが何をするかは定義されていません。 spec ごとに、マージキーは値を持つことができます。

  1. マッピング。この場合、親マッピングにマージされます。
  2. 一連のマッピング。この場合、それぞれが親マッピングに1つずつマージされます。

YAMLレベルでシーケンスをマージする方法はありません

ただし、これはコードで実行できます。 2番目のアイデアのYAMLを使用する:

mobile:
  - *SAMMY

ネストされたシーケンスを取得します-それらをフラット化してください!このようなネストされたシーケンスのマッピングがあると仮定します。

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

(もちろん、より複雑なYAMLファイルがあり、すべてのシーケンスをフラット化したくない場合(またはすべてのシーケンスではない場合)は、フィルタリングを行う必要があります。)

23
Jesse Beder

私が知っている最も近い解決策はこれです:

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

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

または、すでに提案したように、コードスニペットでネストされたリストをフラット化します。

注: yaml-online-parser によると、最初の提案は<<の有効な使用ではありません(2つのディクショナリのキーをマージするために使用されます。アンカーは別のディクショナリをポイントする必要があります)。

29
yngve

mobilesammyと等しくしたい場合は、次のようにします。

mobile: *SAMMY

ただし、mobilesammyの要素に加えて他の要素を含める場合は、私の知る限り、YAMLでそれを行う方法はありません。

17
sepp2k

提案されているように、少なくともRubyでは、リストをフラット化する必要がある場合、「!flatten」タイプ指定子をモバイルに追加し、Arrayを拡張するクラスを実装し、yaml_tagを追加して、コーダーseqをフラット化することは簡単ですinit_with。

0
Eric Woodruff