Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 使用包范围外的Rake执行系统命令_Ruby On Rails 4_Rake_Bundler - Fatal编程技术网

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,它就可以工作了。非常感谢!!