Ruby on rails 4 使用包范围外的Rake执行系统命令
假设我有这个任务:Ruby on rails 4 使用包范围外的Rake执行系统命令,ruby-on-rails-4,rake,bundler,Ruby On Rails 4,Rake,Bundler,假设我有这个任务: 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'}"] syste
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 gem是独立的ruby gem应用程序,其依赖关系需要与应用程序绑定器隔离。换句话说,它不能是Gemfile
的一部分。此gem只需通过gem安装备份安装即可
在bash控制台上运行backup
命令时,它成功运行:
$ backup perform -t validations_backup -c /home/equivalent/my_project/lib/backup/config.rb
当我执行rake db:dump:backup
时,我将得到
backup is not part of the bundle. Add it to Gemfile. (Gem::LoadError)
…当我使用bash中的bundle exec
运行备份命令时,情况也是如此
$ bundle exec backup perform -t validations_backup -c /home/equivalent/my_project/lib/backup/config.rb
…这意味着当作为rake任务的一部分运行时,backup
命令通过bundler执行
我的问题:如何在捆绑包范围外运行rake db:dump:backup
这意味着backup
命令不会在捆绑包上执行
谢谢这是我刚才提到的Capistrano解决方案,它是为那些需要它的人提供的,而我们正在研究如何修复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
我找到了解决此问题的方法:
名称空间:db do
名称空间:dump do
描述“备份数据库转储到s3”
任务:备份
捆绑机,带清洁环境
sh“backup perform-t project_backup-c{Rails.root.join'lib',backup',config.rb'}”
结束
结束
结束
结束
这里的关键是将不能在bundler环境下运行的代码封装在如下块中:
Bundler.with_clean_env do
#需要在未加载bundler环境的情况下运行的代码
结束
…顺便说一句,它也成功地作为远程capistrano任务工作。您解决了吗?我也有同样的问题…不,不是Rake,我仍然在用Capistrano来做这个。以Capistrano为例发布答案我真是太感谢你了-这个问题今晚让我心烦意乱!!你是超级明星!谢谢,我可以选你为我的新上帝吗?如果你试图通过调用应用程序中的shell来运行它,也同样适用。您可能会得到“未找到命令”、“rubygems_集成”和“找不到可执行文件”(添加以帮助搜索者找到此文件)。只需在这个“Bundler.with_clean_env do”块中包装调用shell,它就可以工作了。非常感谢!!