【问题标题】:How do I get my initialization file to distinguish between startup contexts and rake contexts?如何让我的初始化文件区分启动上下文和 rake 上下文?
【发布时间】:2018-04-12 19:52:49
【问题描述】:

我使用的是 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)”正确返回 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

如何区分两者?

【问题讨论】:

  • 也许您可以在您的 Rakefile 中定义一个常量,并在执行所需的代码块之前检查它是否已定义。在 Rakefile 中定义的常量在 Rails 环境中不可用。

标签: ruby-on-rails initialization ruby-on-rails-5 rake


【解决方案1】:

您可以检查$0$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

【讨论】:

    【解决方案2】:

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

    通过在 Rails 5 中运行 rails --help,您可以查看 rails 支持的所有命令,一长串选项。

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

    在内部,通过运行 rails routes,Rails 会检查 routes 是否是 Rails 原生支持的东西。在这种情况下,routes 本身并不受 Rails 支持,因此 Rails 通过 Rake Proxy 将执行委托给 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($0) =='.rake'
          #Doing some stuff
        end
    end
    

    【讨论】:

    • 通过阅读链接或您的解释,我不清楚我需要在文件中进行哪些更改以适应我想要的行为。如果有,请提供代码示例。
    • 据我了解,不可能那样做。因为 rake 文件的扩展名为 .rake,所以您可以检查给定文件是否为 `.rake'。请看更新答案
    • 谢谢。我将检查更改为“if(!Rails.env.test?) && File.extname($0) !='.rake'”,然后运行“rake db:migrate”,但我的脚本仍然运行,即使我没有不想这样。
    【解决方案3】:

    $0 保存当前正在运行的 ruby​​ 程序。 所以这个检查应该适合你:

    File.basename($0) == 'rake'
    

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

    包含正在执行的脚本的名称。可能是可分配的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      相关资源
      最近更新 更多