【问题标题】:Run Rails Runner from Ruby Script从 Ruby 脚本运行 Rails Runner
【发布时间】:2021-01-17 08:06:19
【问题描述】:

我在 Ruby on Rails 应用程序的子目录中有一个 Ruby 脚本,该应用程序在后台运行并执行一些支持任务。在这个脚本中,想访问 Rails 环境和应用程序控制器常量的值。

目前我能找到的检索这些值的最佳方法是基于 Rails runner。如果我跑

cd .. && Rails runner "puts [Rails.env, ApplicationController::CONSTANT_NAME]"

从 shell 的子目录中,我得到了所需的值。但是当我尝试在我的脚本中使用相同的命令时,我得到一个未定义的 active_storage 方法错误:

/home/user/.rvm/gems/ruby-2.6.5/gems/railties-6.0.3.2/lib/rails/railtie/configuration.rb:96:in `method_missing': undefined method `active_storage' for #<Rails::Application::Configuration:0x0000563603fbdaa8> (NoMethodError)

脚本中的代码是

puts %x|cd .. && rails runner "puts [Rails.env, ApplicationController::CONSTANT_NAME]"|

Rails 应用程序和 Ruby 脚本在同一用户下运行。我有 Rails 6.0.3.2 和 Ruby 2.6.5。

【问题讨论】:

  • FWIW,您的代码在 lib(Rails 6)的 ruby​​ 脚本中运行良好。我看不到加载整个 Rails 环境的价值,然后将其丢弃为单个命令。你不能只通过rails runner 运行整个脚本吗?
  • 感谢您的反馈。是的,我同意存在一定的开销,并且可以选择通过 Rails runner 运行整个脚本。就我而言,开销并不是很重要,因为我在启动时只需要一次这个命令。我可以确认该命令在 lib/assets 中有效。我会尝试移动我的脚本。
  • 我找到了错误信息的原因。该脚本有自己的 Gemfile 并包含 require "bundler/setup"。这会清理加载路径并在从脚本中调用 Rails 运行器或 Rake 任务时导致错误。我将修改脚本以更好地与 Rails 集成。感谢 cmets 和答案。

标签: ruby-on-rails ruby runner


【解决方案1】:

你想要做的是写一个Rake task:

# lib/tasks/foo.rake
namespace :foo do
  description "@TODO write a descripion"
  task bar: :environment do
    # your logic goes here
    puts [Rails.env, ApplicationController::CONSTANT_NAME]
  end
end

可以通过bin/rake foo:bar 调用此任务。 bar: :environment 为这个任务加载 Rails 环境。

这比使用 rails runner 少了很多 hacky/wonky,并且是在 Ruby 中编写旨在从命令行调用的任务/脚本的事实上的方式。

【讨论】:

  • 是的,确实如此。 Rake 任务是这里更好、更清洁的解决方案。就我而言,运行时间缩短了大约 50%。
猜你喜欢
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多