我如何获取我的初始化文件以区分启动上下文和 rake 上下文?

How do I get my initialization file to distinguish between startup contexts and rake contexts?

我正在使用 Rails 5.1。我如何获取我的初始化文件(位于 config/my_init.rb)以识别它在服务器启动上下文中何时为 运行 以及在 rake 上下文中何时为 运行任务?我认为下面可以做到...

puts "iniitializing ... #{(!Rails.env.test?) } defined; #{!defined?(::Rake)}"
if(!Rails.env.test?) && !defined?(::Rake)

当我运行执行 rake 任务时,“!defined?(::Rake)”正确 returns false ...

localhost:myproject davea$ rake db:seed
iniitializing ... true defined; false

但是当我启动服务器时,该子句仍然返回 false

localhost:myproject davea$ rails s -b 127.0.0.1
=> Booting Puma
=> Rails 5.1.5 application starting in development
=> Run `rails server -h` for more startup options
iniitializing ... true defined; false

如何区分两者?

简短的解释是: Rails core team decided to have consistency by enabling rails command to support everything that rake does.

通过运行宁rails --help,在Rails5中,可以看到rails支持的所有命令,一长串选项。

您仍然可以选择使用 rake 到 运行 这些命令,就像您在 Rails 中所做的那样 4. 这是因为 Rails 社区引入了 Rake代理而不是将命令选项从 rake 完全移动到 rails.

在内部,通过 运行ning rails routes,Rails 检查 routes 是否是 rails 原生支持的东西。在这种情况下,rails 本身不支持 routes,因此 Rails 通过 Rake 代理将执行委托给 Rake。

A detailed explanation

编辑

您可以使用 File.extname

检查扩展名是否 .rake
# config/initializers/my_init.rb
Rails.application.config.after_initialize do
    # tweak this as required...
    if File.extname([=10=]) =='.rake'
      #Doing some stuff
    end
end

您可以检查 [=12=]$PROGRAM_NAME 是别名

if $PROGRAM_NAME.end_with?("rake")
  puts "I am running under rake"
elsif   $PROGRAM_NAME.end_with?("rails")
  puts "I am running under rails"
end

运行它

$ rake db:seed
I am running under rake

$ rails s -b 127.0.0.1
=> Booting Puma
=> Rails 5.2.0 application starting in development 
=> Run `rails server -h` for more startup options
I am running under rails

[=11=] 保存当前 ruby 程序 运行。 所以这个检查应该适合你:

File.basename([=10=]) == 'rake'

$0 是 Ruby 中的全局定义变量 - Ruby Doc for Global Variables

Contains the name of the script being executed. May be assignable.