【问题标题】:Execute rake task in another project在另一个项目中执行 rake 任务
【发布时间】:2020-01-21 11:08:53
【问题描述】:

在同一台机器上,我有两个 rails 项目/服务器。

我需要从一台服务器执行另一个项目的 rake 任务。这意味着切换上下文和要在其 rails 项目上下文的上下文中运行的 rake 任务。

任务首先加载环境:

task update: :environment do .....

应该运行此任务的代码如下所示:

require 'open3'
module Tasks
  def self.test
    env_vars = {"RAILS_ENV"=>"development"}
    cmd = "bundle exec rake store:update"
    puts "#{cmd}".light_blue
    opts = {:chdir => '/home/master/git/frontend'}
    begin
      stdout_str, error_str, status = Open3.capture3(env_vars, cmd, opts)
    rescue => exception
      puts "Command failed:"
      puts "#{exception}".red      
    end
    puts "#{stdout_str}".green
    if status.success?
      puts "ok".light_green
      puts "#{status.inspect}".yellow
    else
      puts "Command finished with error:"
      puts "#{error_str}".light_red
    end
  end
end

从项目目录执行时,任务运行成功,但从上面的脚本中抛出错误:

rake 中止! LoadError: 无法加载此类文件 -- rails/all /home/csrhub/git/csrhub-frontend/config/application.rb:3:in >`require'

当然在application.rb中有这样一行:

require 'rails/all'

但是有什么区别呢? bash 有效,脚本无效。

如您所见,我正在使用 open3 - 在这种情况下应该是最好的。

我认为这与上下文有关。当我将命令 cmd = "bundle exec rake store:update" 替换为 "rails -v" 时,我收到此错误:

rbenv: rails: 找不到命令

所以我认为问题出在没有查看正确的 gemfile。

【问题讨论】:

  • 您是否考虑过在普通的 Ruby 类而不是 rake 任务中实现逻辑,并通过触发方法调用向第二个应用程序添加路由?
  • 我认为你应该使用 API 在 2 个项目之间进行通信。

标签: ruby-on-rails ruby rake popen3


【解决方案1】:

对不起,我不能离开 cmets。我认为您想创建脚本来设置您的环境,然后调用 rake 任务。

Execute bash commands from a Rakefile

【讨论】:

  • 我不想从 rake 文件中执行 bash 命令。我正在尝试从 rails_project_1/model/file.rb 执行 rails_project_2/lib/tasks/... 中的 rake 文件
猜你喜欢
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2013-06-15
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
相关资源
最近更新 更多