2014-06-18 7 views
9

Let sagen, dass ich diesen Rake Aufgabe haben:mit Rake Execute Systembefehl außerhalb Bundle Umfang

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 

Backup-Juwel ist allein ruby ​​gem Anwendung stehen die Bedürfnisse Abhängigkeiten von der Anwendung bundler isoliert werden. Mit anderen Worten, es kann nicht Teil von Gemfile sein. Dieses Juwel ist einfach installiert über gem install backup

Wenn ich backup Befehl über bash-Konsole ausführen, es erfolgreich ausgeführt:

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

Als ich rake db:dump:backup ausführen ich

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

bekommen ... das ist die gleiche Sache, wenn ich Backup-Befehl mit bundle exec von Bash

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

... bedeutet, dass der Befehl backup über Bundler ausgeführt wird, wenn er als Teil der Rake-Task ausgeführt wird.

meine Frage: Wie kann ich rake db:dump:backup outsite das Bündel Umfang laufen, was bedeutet, dass backup Befehl über Bündler ausgeführt werden gewannen `t?

Danke

+0

... BTW funktioniert auch erfolgreich als Remote Capistrano Aufgabe – equivalent8

+0

Haben Sie es gelöst? Ich habe das gleiche Problem ... – Lichtamberg

+0

nein, nicht von Rake Ich benutze immer noch Capistrano, um dies zu tun. Antwort schreiben mit Capistrano Beispiel – equivalent8

Antwort

17

fand ich eine Abhilfe für dieses Problem 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 

Der Schlüssel hier ist, den Code zu umschließen, die nicht unter bundler Umgebung in einem Block wie folgt ausgeführt werden muss:

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

Ich kann dir nicht genug danken - diese Ausgabe hat mich heute Nacht umgebracht !! Du Superstar! –

+2

Danke, kann ich dich als meinen neuen Gott wählen? –

+1

Gilt auch, wenn Sie dies versuchen, indem Sie eine Shell in einer App aufrufen. Sie können "command not found" und "rubygems_integration" und "can not find executable" erhalten (Hinzufügen, um Suchenden dabei zu helfen). Umbrechen Sie einfach Ihre Shell in diesem "Bundler.with_clean_env do" -Block und es funktioniert. Vielen Dank !! – JosephK

0

Hier ist die Capistrano Lösung, die ich für diejenigen, wurde zu erwähnen, die es brauchen, während wir herausfinden, wie Rake zu beheben.

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 
Verwandte Themen