覆盖Capistrano默认行为

时间:2012-01-26 11:00:04

标签: ruby-on-rails capistrano

我正在使用capistrano来部署我的rails应用程序。我想覆盖deploy:assets:precompile任务,但我无法做到这一点。任何人都知道为什么这不起作用?如果不可能,是否可以跳过每次运行deploy:assets:precompile任务时都运行deploy

这是我的deploy.rb     加载“config / domain.rb”

set :application, DOMAIN
set :repository, "..."
set :use_sudo, false
set :deploy_to, "/var/www/#{application}"
set :deploy_via, :remote_cache
set :user, "yomama"
set :port, 1337
set :scm, :git
set :normalize_asset_timestamps, false

role :web, "123.123.123.123"
role :app, "123.123.123.123"
role :db,  "123.123.123.123", primary: true

# RVM bootstrap
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
set :rvm_ruby_string, "1.9.2@#{application}"
set :rvm_type, :system
set :rvm_bin_path, "/usr/local/bin"

# bundler bootstrap
require "bundler/capistrano"

namespace :deploy do
  desc "Zero-downtime restart of Unicorn"
  task :restart, :except => { :no_release => true } do
    run "kill -s USR2 `cat #{shared_path}/pids/unicorn.pid`"
  end

  desc "Start unicorn"
  task :start, :except => { :no_release => true } do
    run "cd #{current_path} ; bundle exec unicorn_rails -c config/unicorn.rb -D -E production"
  end

  desc "Stop unicorn"
  task :stop, :except => { :no_release => true } do
    run "kill -s QUIT `cat #{shared_path}/pids/unicorn.pid`"
  end  

  desc "symlink shared files between releases"
  task :symlink_shared, :roles => :app do
    run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
        run "ln -nfs #{shared_path}/assets #{release_path}/assets"
    run "ln -nfs #{shared_path}/public/uploads #{release_path}/public/uploads"
        # run "ln -nfs #{shared_path}/log/production.log #{release_path}/log/production.log"
  end

  namespace :assets do
    desc "Precompile assets only if it is needed"
    task :precompile, :roles => :web, :except => { :no_release => true } do
      from = source.next_revision(current_revision)
      run "cd #{latest_release} && #{source.local.log(from)} vendor/assets/ lib/assets/ app/assets/ | wc -l"
      if capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ lib/assets/ app/assets/ | wc -l").to_i > 0
        run %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile}
      else
        logger.info "Skipping asset pre-compilation because there were no asset changes"
      end
    end
  end
end

desc "tail production log files" 
task :tail_logs, :roles => :app do
  run "tail -f #{shared_path}/log/production.log" do |channel, stream, data|
    trap("INT") { puts 'Interupted'; exit 0; } 
    puts  # for an extra line break before the host name
    puts "#{channel[:host]}: #{data}" 
    break if stream == :err
  end
end

after "deploy:update_code", "deploy:symlink_shared"

1 个答案:

答案 0 :(得分:4)

我很蠢!我正在以错误的顺序加载文件我的capfile。

在:

load 'deploy' if respond_to?(:namespace) # cap2 differentiator
Dir['vendor/gems/*/recipes/*.rb','vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
load 'config/deploy' # remove this line to skip loading any of the default tasks
# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'

后:

load 'deploy' if respond_to?(:namespace) # cap2 differentiator
Dir['vendor/gems/*/recipes/*.rb','vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'
load 'config/deploy' # remove this line to skip loading any of the default tasks

现在可行。