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

然后有一条规则(这是我的猜测,因为我对 ruby​​ 完全一无所知)告诉如何制作build/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.jsjs/config.js移动到它的第一个位置?这可以作为oneliner(即附加到上面的.split调用的一些代码)来完成吗?

更新:

微薄建议(谢谢!)代码:

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 回答