Rails 关于 Rails 命令的问题

chucai · 2012年09月28日 · 最后由 chucai 回复于 2012年09月28日 · 3221 次阅读

在 shell 环境下,运行

which rails

会得到如下结果

/home/hexudong/.rvm/gems/ruby-1.9.2-p320/bin/rails

rails与 Rails Project 下的script/rails有何区别?

每个项目有自己的配置,home 下的是你的用户配置

这个问题有些意思,我大概分析了下加载 rails 的过程,在 Rails Project 下的 rails 是用来加载当前项目下的服务的,而 bin/rails 会加载 gems/railties-3.2.7 下的 application.rb 最终根据参数加载 server.rb generator.rb 等。。。

总结下输入 rails 后的动作:

  • rvm 下缺省 ruby 版本下的 bin/rails
  • 加载 railties 下的 rails, 如果是在 Rails Project 下执行,则使用 exec 替换执行 script/rails 以下的不再执行,以提高速度。
  • 加载 railties 下的 rails,它加载整个 rails 环境,比如 active_support, 设定模块常量。
  • 根据 cli 参数加载指定的操作,如 server, generator 等
  • 进入初始化后流程,结束

#2 楼 @lyfi2003 :-),分析的很深入啊

#3 楼 @chucai 等飞机,无聊就看了下,其实还可能有些细节有出入,有兴趣的人可以纠正或补充~

补充一些,也是我前段时间折腾出的心得,分享给大家: 其实这里面有三个 rails 可执行文件 一个是 /home/hexudong/.rvm/gems/ruby-1.9.2-p320/bin/rails, 他其实是非常重要的一个东西,他会检查你当前是否存在 Gemfile, 如果存在就找到 Gemfile 里面相关的 railtie,若没有就用最新的 rails 版本。找到相应的 railtie 版本后找到第二个可执行 rails,比如/home/zgm/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.5/bin/rails 这个,是因为我在执行 rails 的时候在一个 rails 项目里面,且这个项目用的是 rails-3.2.5, 这个会找到一个 cli.rb 的文件,他来判断是否当前在 rails 目录或其子目录下面,如果是就找到第三个 scrict/rails,这之后会发生什么就取决于你 rails 后面的参数是什么了。其实一个 rails 命令要跑的东西真是超多啊,但是都在背后罢了,要想知道其中的奥秘,快去读读代码吧

#5 楼 @zgm 给力的解析,说的很清楚。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号