0

build.rakeファイルには、JavaScript ファイルの名前を保持する配列があります。

JS_FROM_INDEX=`./bin/extract_files -e js index.html`.split

次のファイルを保持します。

js/config.js
js/vendor/dollar.js
js/vendor/ejs.min.js
js/utils.js
......
js/Viewport.js

次に、 build/app.jsファイルの作成方法を示すルールがあります (私はまだ ruby​​ について完全に無知なので、これは私の推測です) 。つまり、最初にjs/config.jsファイルを取得し、次に .上記の配列をそれに:

file DEST + '/app.js' => [DEST]+JS_FROM_INDEX.dup << 'index.html' << DEST do |t|
  sh "cat js/config.js > #{t.name}"
  sh "cat #{JS_FROM_INDEX.reject{|f| f =~ /\/config\.js/ }.join(" ")} | bin/yuicompressor --type js >> #{t.name}"
end

問題なく動作しますが、js/utils.jsはjs/config.jsの前であっても、最初にある必要があることがわかりました。

だから私の質問は:

js/utils.jsjs/config.jsが最初の位置に移動するように、 JS_FROM_INDEX配列を並べ替える良い方法はありますか? これはワンライナー (つまり、上記の.split呼び出しに追加されたコード) として実行できますか?

アップデート:

Meager は (ありがとう!) コードを提案しました:

scripts.unshift("js/config.js") if scripts.delete("js/config.js");
scripts.unshift("js/utils.js") if scripts.delete("js/utils.js");

それを Rakefile に統合するには、さらに 2 つの変数を導入する必要があると思います。

JS_FROM_INDEX=`./bin/extract_files -e js index.html`.split
JS_SORTED_1=......use JS_FROM_INDEX somehow....
JS_SORTED_2=......use JS_FROM_SORTED_1 somehow....

file DEST + '/app.js' => [DEST]+JS_SORTED_2.dup << 'index.html' << DEST do |t|
  sh "cat #{JS_FROM_INDEX.reject{|f| f =~ /\/config\.js/ }.join(" ")} | bin/yuicompressor --type js >> #{t.name}"
end

上記のドットを接続する方法について何かアイデアはありますか?

4

1 に答える 1

3

配列から項目を削除し、(削除中に見つかった場合) 配列の先頭にプッシュします。

scripts = %w(js/config.js
            js/vendor/dollar.js
            js/vendor/ejs.min.js
            js/utils.js)

# Move config.js first
scripts.unshift("js/config.js") if scripts.delete("js/config.js");

# Move utils.js second to ensure it is always before config.js
scripts.unshift("js/utils.js") if scripts.delete("js/utils.js");

ここでは、削除するアイテムが見つからなかった場合にdelete返されるため、アイテムが前面に戻されることはありません。nilunshift

リストを反復処理することで、これをより一般的なものにすることができます。

items_to_sort_to_front.each { |item| scripts.unshift(item) if scripts.delete(item) }

リストの最後のアイテムが の前に移動される最後のアイテムになるため、items_to_sort_to_front 後方にソートすることを忘れないでscriptsください。

于 2012-06-29T13:25:42.400 に答える