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)