2012-06-29 1 views
0

В build.rake файле У меня есть массив, содержащий имена файлов JavaScript:Массив имен файлов: как переместить 2 определенных файла (если они есть) на передний план?

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 

Тогда существует правило, которое (это мое предположение, как я совершенно невежественно рубин еще) рассказывает, как сделать сборки/app.js файла, а именно: принять 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_FROM_INDEX массива, так что JS/utils.js и JS/config.js перемещаются в его первые позиции? Можно ли это сделать как oneliner (например, какой-то код добавлен к вызову .split)?

UPDATE:

Скудные предложил (спасибо!) Код:

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 

Любые идеи, пожалуйста, как подключить точки выше?

ответ

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 возвращает nil если элемент для удаления не было найдено, поэтому элемент никогда не возвращается unshift назад назад.

Вы можете легко сделать это более общий характер с итерацией по списку:

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

Просто помните, чтобы отсортировать items_to_sort_to_frontназад, как последний элемент в списке будет последним перешел на фронт от scripts.

+0

Хорошо спасибо, имеет смысл. Мне просто интересно, как добавить это в Rakefile, поскольку я исхожу из фона perl/Makefiles ... Можно ли это сделать как oneliner и добавить к вызову '.split'? –

Смежные вопросы