使用Rake在Bundle范围外执行系统命令

equ*_*nt8 10 rake bundler ruby-on-rails-4

假设我有这个Rake任务:

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
Run Code Online (Sandbox Code Playgroud)

备份gem是独立的ruby gem应用程序,其依赖关系需要与应用程序捆绑器隔离.换句话说,它不能成为其中的一部分Gemfile.这个宝石只是安装在上面gem install backup

当我backup通过bash控制台运行命令时,它成功运行:

$ backup perform -t validations_backup -c /home/equivalent/my_project/lib/backup/config.rb
Run Code Online (Sandbox Code Playgroud)

当我执行时,rake db:dump:backup我会得到

backup is not part of the bundle. Add it to Gemfile. (Gem::LoadError)
Run Code Online (Sandbox Code Playgroud)

...当我用bundle execbash 运行备份命令时,这是同样的事情

$ bundle exec backup perform -t validations_backup -c /home/equivalent/my_project/lib/backup/config.rb
Run Code Online (Sandbox Code Playgroud)

...意味着backup当作为rake任务的一部分运行时,命令在bundler上执行.

我的问题:如何运行rake db:dump:backup现场捆绑范围,这意味着backup命令不会通过捆绑器执行?

谢谢

Ern*_*sto 20

我在这里找到了解决此问题的方法:

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
Run Code Online (Sandbox Code Playgroud)

这里的关键是将一个不能在bundle的环境下运行的代码包含在这样的块中:

Bundler.with_clean_env do
  # Code that needs to run without the bundler environment loaded
end
Run Code Online (Sandbox Code Playgroud)

  • 我不能够感谢你 - 这个问题今晚杀了我!你是超级巨星! (2认同)
  • 谢谢,我可以选举你为我的新神吗? (2认同)