68

私はJammitを使用してRailsアプリケーション用にアセットをパッケージ化しており、いくつかのグループのそれぞれに含めたいアセットファイルがいくつかあります。たとえば、 SammyとそのプラグインをmyパッケージmobilescreenJSパッケージの両方に含めたいと思います。

私はこれを試しました:

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

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

この:

mobile:
  - *SAMMY

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

注意:この場合、SAMMY配列には2つの要素しかないので、各パッケージにエイリアスと参照の両方を指定するのはそれほど悪くないことだと思います。この場合は問題ありませんが、特定のロード順序を持つ要素が5つまたは10つあると、すぐに保守できなくなります。

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によると、最初の提案は << の有効な使用法ではありません (2 つの辞書のキーをマージするために使用されます。アンカーは、私が信じている別の辞書を指す必要があります。

于 2014-11-19T16:45:31.540 に答える
33

mobileと等しくなりたい場合はsammy、次のようにすることができます。

mobile: *SAMMY

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

于 2011-02-09T18:45:33.517 に答える
32

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

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

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

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

mobile:
  - *SAMMY

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

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

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

于 2011-02-09T18:51:08.683 に答える
-2

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

于 2016-07-28T06:26:15.413 に答える