2014-06-18 11 views
9

powiedzmy mam tego zadania Rake:Wykonaj polecenia systemowego z prowizji poza zakresem 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 

zapasowa gem jest samodzielna aplikacja ruby ​​gem, które Zależności musi być odizolowane od Bundler aplikacji. Innymi słowy, nie może być częścią Gemfile. Ten Klejnot jest po prostu zainstalowany nad gem install backup

Kiedy biegnę backup komendę nad konsoli bash, to z powodzeniem uruchomić:

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

Kiedy wykonać rake db:dump:backup dostanę

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

... co jest to samo, gdy uruchomię polecenie tworzenia kopii zapasowej z bundle exec z bash

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

... co oznacza, że ​​polecenie backup jest wykonywane nad pakerem, gdy jest uruchamiane jako część zadania rake.

moje pytanie: Jak mogę uruchomić rake db:dump:backup outsite zakresu wiązki, co oznacza, że ​​komenda backup won `t być wykonywane przez Bundler?

Dziękuję

+0

... z powodzeniem działa jako zdalne zadanie capistrano – equivalent8

+0

Rozwiązałeś problem? Mam ten sam problem ... – Lichtamberg

+0

nie, nie przez Rake. Wciąż używam Capistrano, żeby to zrobić. Zamieszczanie odpowiedzi za pomocą przykładu Capistrano: – equivalent8

Odpowiedz

17

znalazłem obejście tego problemu 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 

Kluczem tutaj jest, aby dołączyć kod, który nie musi działać w środowisku Bundler w bloku tak:

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

Nie mogę ci wystarczająco podziękować - ten problem został zabity dziś wieczorem !! Ty superstar! –

+2

Dzięki, czy mogę wybrać ciebie jako mojego nowego boga? –

+1

Ma również zastosowanie, jeśli próbujesz uruchomić to przez wywołanie powłoki w aplikacji. Możesz otrzymać polecenie "command not found" i "rubygems_integration" oraz "can not find executable" (dodawanie, aby pomóc znaleźć to). Po prostu zawiń wywołanie swojej powłoki w tym bloku "Bundler.with_clean_env do" i działa. Dzięki bardzo bardzo !! – JosephK

0

Oto rozwiązanie Capistrano miałem wspomnieć o tych, którzy potrzebują go, gdy dowiemy się, jak rozwiązać prowizji.

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 
Powiązane problemy