之前在Rails入门指南中浏览相关知识,再一次进入Rails启动流程页面,再次阅读这个章节,收获颇多。
之前在Rails开发过程中,诸如rails s,rails g等等命令是如何能够在项目文件夹中展开工作的?Rails应用项目的config文件夹中的配置是如何被读取的?等等一些疑问一直困扰着我,而这些疑问在本次阅读过程中,有了一个较好的答案。当然,如果需要更深层次的理解,我还需要更加深入的阅读Rails的源代码。
本次例子以rails sever,这个命令为例,对rails项目的启动流程进行了一个较为全面的介绍。
1.运行rails sever命令。
当我们运行着个命令的时候,我们的最终目的是想寻找自己正在进行的rails应用文件夹中bin/rails可执行文件。因此rails sever这个命令与exec ruby bin/rails server这个命令功能等同。
那么rails sever是如何寻找到APP_NAME/bin/rails命令的呢?
事情是这样的,我们知道rails是操作系统中可执行的命令,当我们运行rails sever的时候,该命令会加载railties/bin/rails.rb这个文件,而这个文件中有这么一行命令require"rails/cli",railties/lib/rails/cli.rb 文件会执行Rails::AppRailsLoader.exec_app_rails,这个命令会最终寻找到APP_NAME/bin/rails可执行文件。
2.bin/rails
既然rails sever命令最终寻找到的是APP_NAME/bin/rails这个可执行文件,那么我们来看看这个文件中的内容是什么。
打开可执行文件,我们可以发现,这个文件有三行代码,第一行,将config/application.rb这个文件的路径存在了常量APP_PATH之中,第二行,加载了config/root.rb文件,第三行,加载了railties/lib/rails/command.rb文件。
在root文件中,rails将我们正在开发的应用的gem依赖全部加载。
在command文件 中,rails将我们开发过程中可能遇到的rails s或者rails g等简化命令转化成标准的rails sever或者rails generate命令,并最终运行命令。
3.railties/rails/commands/command_tasks.rb
在上一小节中,command文件中命令最终运行依赖的是command_task.rb文件中提供的方法。阅读该文件中的源代码,我们可以明白sever、generate等命令运行最终会调用railties/rails/commands/文件夹中相应文件名的文件来结束完成本条命令的目标。
4.config/application.rb
之前在bin/rails可执行文件中,rails在APP_PATH常量中保存了config/application.rb文件的路径,而在command_tasks.rb文件的执行过程中,rails会执行require APP_PATH命令,这样config/application.rb命令就被加载了。
在application.rb文件中,有这样一条命令require'rails/all',这条命令会加载railties/lib/rails/all.rb,而all.rb文件将active_record、active_mailer等组件下的railstie.rb文件夹一一加载。railties库以这种方式对rails的不同组件进行了胶合。
application.rb文件中剩余部分则配置了rails应用启动之后所需的一些配置信息。
通过对Rails启动流程这个指南章节的阅读,可以对rails这个开源框架的启动流程及组成方式有一个较为初步的认识。