如果我正在运行 rake 命令,如何在 rails 中检测?

Sha*_*rey 6 environment rake ruby-on-rails

在 Rails 中,您可能希望您的环境在启动时做不同的事情,这取决于您是否正在运行 rake 任务。例如,我的用例是在应用程序启动时将数百 MB 的缓存加载到内存中。我们显然不希望这种情况发生在 rake 命令上。

---更新--- 以下是可靠的解决方案,适用于heroku。

is_rake = (ENV['RACK_ENV'].blank? || ENV['RAILS_ENV'].blank? || !("#{ENV.inspect}" =~ /worker/i).blank?)
Run Code Online (Sandbox Code Playgroud)

x-y*_*uri 6

对于运行迁移的特殊情况,我执行了以下操作:

if defined?(Rake) \
&& Rake.application.top_level_tasks.grep(/\Adb:migrate(\[[^\]]*\])?\z/).length > 0
  ...
end
Run Code Online (Sandbox Code Playgroud)

特别是,它涵盖了我们没有运行的情况rake

Rake.application.top_level_tasksrake由参数列表(要执行的任务)设置:

https://github.com/ruby/rake/blob/v13.0.3/exe/rake#L27
https://github.com/ruby/rake/blob/v13.0.3/lib/rake/application.rb#L81
https://github.com/ruby/rake/blob/v13.0.3/lib/rake/application.rb#L97
https://github.com/ruby/rake/blob/v13.0.3/lib/rake/application .rb#L751-L761


Sha*_*rey 1

如果您正在使用heroku并且正在使用workers,那么这里有一种更可靠的方法来进行此检查。

is_rake = (ENV['RACK_ENV'].blank? || ENV['RAILS_ENV'].blank? || !("#{ENV.inspect}" =~ /worker/i).blank?)
Run Code Online (Sandbox Code Playgroud)