2011-07-27 78 views
0

我目前正在研究Capistrano的多阶段配方,理想情况下,部署之后,明智地使用yui压缩器来处理所有css和js。Capsitrano部署食谱:在部署文件列表和修改之后

这是我目前走过来:

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) 

我只要Capistrano的到达点得到。 作为Ruby,Rails和Capistrano的总新手,我理解FileList不是普通的Capistrano方法,但无法弄清楚用什么来代替它。

感谢您的帮助。

+0

您的意思是:: Rake :: Filelist? – jimworm

回答

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编程,你应该移动代码的代码放到一个耙子任务(您可以尝试本地调试),然后用Capistrano调用它:How do I run a rake task from Capistrano?