我目前正在研究Capistrano的多阶段配方,理想情况下,在部署之后,明智地使用yui压缩器来处理所有css和js。
这是我目前的目标:
after "deploy", "deploy:cleanup", "minifier:compress"
# Task to minify via Yui-compressor
# Uses compressor bundled with application in #{application}/lib/yuicompressor
namespace :minifier do
def minify(files)
files.each do |file|
cmd = "java -jar lib/yuicompressor/build/yuicompressor-2.4.6.jar #{file} -o #{file}"
puts cmd
ret = system(cmd)
raise "Minification failed for #{file}" if !ret
end
end
desc "minify"
task :compress do
minify_js
minify_css
end
desc "minify javascript"
task :minify_js do
minify(Filelist['public/js/**/*.js'])
end
desc "minify css"
task :minify_css do
minify(Filelist['public/css/**/*.css'])
end
end
让我感到困惑的是
uninitialized constant Capistrano::Configuration::Filelist (NameError)
一旦卡皮斯特拉诺达到目的,我就会得到。
作为Ruby,Rails和Capistrano的新手,我理解由于某种原因,FileList不是常见的Capistrano方法,但无法弄清楚要替换它的内容。
感谢您的帮助。
答案 0 :(得分:1)
您的任务在概念上是错误的,它将在本地系统(您正在部署的系统)上运行,因为您正在调用system
,您应该使用运行命令的run
方法远程的。
def minify(files)
files.each do |file|
cmd = "java -jar lib/yuicompressor/build/yuicompressor-2.4.6.jar #{file} -o #{file}"
puts cmd
ret = system(cmd) # *** SYSTEM RUN LOCAL COMMANDS ***
raise "Minification failed for #{file}" if !ret
end
end
也就是说,我将使用shell脚本更改该代码,类似于(未经测试的)
task :minify
cmd = "java -jar lib/yuicompressor/build/yuicompressor-2.4.6.jar"
run "find #{current_path}/public/css/ -name '*.css' -print0 | xargs -0 -I file #{cmd} file -o file"
run "find #{current_path}/public/js/ -name '*.js' -print0 | xargs -0 -I file #{cmd} file -o file"
end
或者如果您更喜欢使用ruby来编程,您应该将代码移动到rake任务(您可以在本地尝试和调试),然后使用Capistrano调用它:How do I run a rake task from Capistrano?