rails 只是一堆代码,并不能独立运行,必须有其他的进程来讲 rails 的代码“加载”起来 例如 passenger 在启动的时候就会加载 rails 的代码,这个加载时啥意思?能具体解释一下吗? 是把 rails 的代码都读入内存?全部代码? 我知道 rails 的加载其实就是在初始化一些 contants,把所有的模块、类等的常量的名字读入自己的内存空间而已 那么既然其他程序把 rails 的代码加载进内存了,是不是就可以把 rails 工作目录删除也没啥问题?(这个当然不行~~~~~)
要搞清楚这个,需要阅读 Rails Autoload 的文档。
简单来说 Rails 并没有把所有项目的文件加载到内存里面。
在 Rails 里面下面这类 (包括,但不限于) 是不会加载到内存的:
是否会进入内存,要看有没有被 require 到,这里不能直接的说都有或都没有,在 Rails 里面,有 Autoload 和 EagerLoad 两种机制,前者是按需加载,后者是启动的时候直接加载。
同时 Gem 里面的 .rb 文件也不一定都在启动的时候进入内存了的,有些可能是需要手动 require 的。
执行 rails c,可以看到:
irb > Rails.application.config.autoload_paths
=> ["/Users/jason/work/ruby-china/lib"]
irb > Rails.application.config.eager_load_paths
=> ["/Users/jason/work/ruby-china/app/assets", "/Users/jason/work/ruby-china/app/channels", "/Users/jason/work/ruby-china/app/controllers", "/Users/jason/work/ruby-china/app/helpers", "/Users/jason/work/ruby-china/app/jobs", "/Users/jason/work/ruby-china/app/mailers", "/Users/jason/work/ruby-china/app/models", "/Users/jason/work/ruby-china/app/models/concerns", "/Users/jason/work/ruby-china/app/serializers", "/Users/jason/work/ruby-china/app/uploaders", "/Users/jason/work/ruby-china/app/channels/notifications_channel.rb", "/Users/jason/work/ruby-china/app/channels/replies_channel.rb", "/Users/jason/work/ruby-china/lib/exception_notifier"]
application.rb 里面允许配置。
同时,别忘了还有 require 的
require 'markdown'
Bundler.require(*Rails.groups)
@huacnlee 为什么 homeland 里用 development 模式启动代码,修改 app/controllers/ 的代码不会自动重新加载,还需要重启服务?有点疑惑