2011-11-04 45 views
2

我正在查看Rails 3的代码。在启动过程中加载的rails/cli.rb中,它调用了Rails::ScriptRailsLoader.exec_script_rails!,然后通过调用exec再次加载应用程序来替换当前的ruby进程:为什么Rails在启动时自行执行?

exec RUBY, SCRIPT_RAILS, *ARGV if in_rails_application? 

我不熟悉Rails代码库,所以我的问题是这是什么理由?为什么Rails不能在同一个原始过程中继续启动?我确信有一个很好的理由,我只是不知道。

回答

2

我认为这个想法是,“轨”作为命令行可执行文件两种方式使用:

  • 初始化应用程序(Rails应用程序之外)
  • 做的事情为一个应用程序(前推出的服务器 - Rails应用程序目录内)

例如,一个Rails应用程序之外:

$ rails -h 
Usage: 
    rails new APP_PATH [options] 
... 

而且一个Rails应用程序内:

$ rails -h 
Usage: rails COMMAND [ARGS] 
... 

看起来exec_script_rails!用来挑哪个接口rails命令呈现给用户。这commentScriptRailsLoader看看建议该方法只调用exec如果用户在一个轨道应用程序内 - 特别是一个目录'脚本/轨道'存在。在这种情况下,EXEC替换'脚本/ Rails的原始过程,使这些等价的:

$ rails ... 
$ ruby script/rails ... 

否则脚本将继续在相同的过程。所以理由是它允许'rails'命令以特定于上下文的方式运行,从而保留'script/rails'所做的任何操作。