2014-06-18 11 views
9

Let Bu Rake görev var ki:Paket kapsamı dışında Rake ile sistem komutu yürütün

namespace :db do 
    namespace :dump do. 
    desc 'Backup database dump to s3' 
    task :backup => :environment do 
     cmd = ['backup', 'perform', '-t project_backup', "-C#{Rails.root.join 'lib', 'backup', 'config.rb'}"] 
     system(*cmd)      # ...I've tried `` & exec() sa well, same thing 
    end 
    end 
end 

Yedekleme mücevher uygulama paketleyici izole edilmesi ihtiyacını bağımlılıkları yalnız yakut mücevher uygulamasını standı olduğunu. Başka bir deyişle, Gemfile'un parçası olamaz. Bu taş sadece ben bash konsoluna üzerinde backup komutu çalıştırdığınızda, başarıyla çalıştırmak

gem install backup üzerinde yüklenir: Ben rake db:dump:backup çalıştırdığınızda

$ backup perform -t validations_backup -c /home/equivalent/my_project/lib/backup/config.rb 

Ben hangi ...

backup is not part of the bundle. Add it to Gemfile. (Gem::LoadError) 

alacak aynı şey, bundle exec ile

'ten yedek komutu çalıştırdığımda

... anlamı, backup komutunun, komisyon görevinin bir parçası olarak çalıştırıldığında dağıtıcı üzerinde gerçekleştirilmesidir.

sorumu : nasıl backup komut paketleyici üzerinde yürütülecek `kazandı, yani paket kapsamı outsite rake db:dump:backup çalıştırabilirim?

Eğer

+0

... btw başarıyla başarılı bir kapistrano görevi olarak çalışıyor – equivalent8

+0

Bunu çözdünüz mü? Aynı sorun var ... – Lichtamberg

+0

hayır, Rake tarafından değil Hala bunu yapmak için Capistrano kullanıyorum. Capistrano örneğiyle cevap gönderme – equivalent8

cevap

17

Ben bu soruna here için geçici bir çözüm buldu:

namespace :db do 
    namespace :dump do 
    desc 'Backup database dump to s3' 
    task :backup do 
     Bundler.with_clean_env do 
     sh "backup perform -t project_backup -C#{Rails.root.join 'lib', 'backup', 'config.rb'}" 
     end 
    end 
    end 
end 

Burada anahtar böyle bir blokta bundler ortamına altında çalışacak olmamalıdır kodu kapsamaktır:

Bundler.with_clean_env do 
    # Code that needs to run without the bundler environment loaded 
end 
+2

Size yeterince teşekkür edemem - bu sorun beni bu gece KILLING! Seni süperstar! –

+2

Teşekkürler, seni yeni tanrım olarak seçebilir miyim? –

+1

Ayrıca, bir uygulama içinde bir kabuk çağırmak suretiyle bunu çalıştırmaya çalışıyorsanız da geçerlidir. "Komut bulunamadı" ve "rubygems_integration" ile "yürütülebilir dosyayı bulamıyor" (arama yapanların bunu bulmasına yardımcı olmak için ekleyerek) alabilirsiniz. Kabuğunuzu bu "Bundler.with_clean_env" bloğu içinde çağırmanız yeterlidir ve işe yarıyor. Çok teşekkürler çok çok !! – JosephK

0

Burada biz Rake düzeltmek için nasıl anlamaya ederken ihtiyacı olanlar için söz edilmiştir Capistrano çözümdür ederiz.

class BackupDatabaseCmd 
    def self.cmd 
    # some logic to calculate : 
    'RAILS_ENV=production backup perform -t name_of_backup_task -c /home/deploy/apps/my_project/current/lib/backup/config.rb' 
    # in the configuration file I'm loading `config/database.yml` 
    # and passing them to backup gem configuration 
    end 
end 

namespace :backup do 
    namespace :database do 
    task :to_s3 do 
     on roles(:web) do 
     within release_path do 
      with rails_env: fetch(:rails_env) do 
      execute(BackupDatabaseCmd.cmd) 
      end 
     end 
     end 
    end 
    end 
end 

# cap production backup:database:to_s3 
İlgili konular