2014-06-18 6 views
9

Let dire che ho questo compito Rake:comando di sistema Eseguire con il rastrello fuori portata Bundle

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 

gemma Backup è applicazione stand alone rubino gemma che dipendenze deve essere isolato dal bundler applicazione. In altre parole, non può far parte di Gemfile. Questo gioiello è installato semplicemente sopra gem install backup

Quando eseguo backup comando sulla console bash, è eseguito correttamente:

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

Quando eseguo rake db:dump:backup mi metterò

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

... che è la stessa cosa quando eseguo il comando di backup con bundle exec da bash

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

... significa che il comando backup viene eseguito su bundler quando viene eseguito come parte di rake task.

la mia domanda: Come posso eseguire rake db:dump:backup outsite la portata fascio, il che significa che backup comando non potrà essere sostituita eseguito su bundler?

Grazie

+0

... btw funziona correttamente anche come attività remote capistrano – equivalent8

+0

L'hai risolto? Ho lo stesso problema ... – Lichtamberg

+0

no, non di Rake. Sto ancora usando Capistrano per farlo. Pubblicare la risposta con l'esempio di Capistrano – equivalent8

risposta

17

ho trovato una soluzione per questo problema here:

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 

La chiave qui è quello di racchiudere il codice che non deve essere eseguito in ambiente di bundler in un blocco come questo:

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

Non posso ringraziarti abbastanza - questo problema è STATO UCCISO me stasera !! Superstar! –

+2

Grazie, posso sceglierti come mio nuovo dio? –

+1

Si applica anche se si sta tentando di eseguirlo richiamando una shell all'interno di un'app. Potresti ottenere "command not found" e "rubygems_integration" e "can not find eseguable" (aggiungendo per aiutare gli utenti a trovarlo). Basta racchiudere la tua shell all'interno di questo blocco "Bundler.with_clean_env do" e funziona. Grazie mille !! – JosephK

0

Ecco la soluzione Capistrano accennavo per chi ne ha bisogno, mentre noi capire come risolvere Rake.

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