我正在查看Rails 3的代码。在启动过程中加载的rails/cli.rb
中,它调用Rails::ScriptRailsLoader.exec_script_rails!
,然后通过重新加载来替换当前的ruby进程。通过调用exec第二次申请:
exec RUBY, SCRIPT_RAILS, *ARGV if in_rails_application?
我对Rails代码库并不熟悉,所以我的问题是这个的基本原理是什么?为什么Rails不会继续在同一个原始进程中启动?我确信有充分的理由,我只是不知道。
答案 0 :(得分:2)
我认为这个想法是'rails'作为命令行可执行文件以两种方式使用:
例如,在rails app之外:
$ rails -h
Usage:
rails new APP_PATH [options]
...
在rails app中:
$ rails -h
Usage: rails COMMAND [ARGS]
...
看起来exec_script_rails!
用于选择rails命令向用户显示的接口。这个comment并查看ScriptRailsLoader表明,如果用户位于rails应用程序内,该方法仅调用exec
- 特别是存在'script / rails'的目录。在这种情况下,exec用'script / rails'替换原始进程以使它们等效:
$ rails ...
$ ruby script/rails ...
否则脚本将继续执行相同的过程。因此,理由是它允许'rails'命令以特定于上下文的方式运行,以保留'script / rails'所做的任何事情。