我注意到,当我更改rails项目文件(如html.erb
或.css
)时,我不必使用rails -s
命令重新启动服务器.
但我认为,当我想安装一个新的Ruby ,我必须.问题是我正在努力让jQuery工作,所以我厌倦了一直做rails -s
.
谁能告诉我,当我修改我的应用程序时,什么时候我必须再次运行rails -s
,什么时候我能负担得起不运行rails -s
?不这样做,我的意思是简单地刷新网页以查看更改.
我注意到,当我更改rails项目文件(如html.erb
或.css
)时,我不必使用rails -s
命令重新启动服务器.
但我认为,当我想安装一个新的Ruby ,我必须.问题是我正在努力让jQuery工作,所以我厌倦了一直做rails -s
.
谁能告诉我,当我修改我的应用程序时,什么时候我必须再次运行rails -s
,什么时候我能负担得起不运行rails -s
?不这样做,我的意思是简单地刷新网页以查看更改.
因为这个答案是我在StackOverflow上最明显的答案,而且它已经很旧了,所以我认为是时候更新它,让它更深入一点了.它的原始信息是正确的,但它有点太笼统了,我觉得我可以更好地解释它与我现在的知识.原始答案保存在下面.
Rails与plain ruby相比的工作方式是,它基本上需要您的文件处于动态状态,而无需在文件顶部添加require
.如今,官方的Rails guides here上有一个关于它的相对深入的页面.
从Rails 6开始,他们引入了一个新的加载程序来管理自动加载源文件的逻辑,并将其卸载到一个名为zeitwerk的gem.这里有also a page on the Rails guides条解释了新加载器的工作原理.
基本思想是这样的:
Rails运行一系列配置文件(environment.rb
、application.rb
、boot.rb
、相应的environments/<environment>.rb
、config/routes.rb
、初始值设定项等).在这个开始阶段运行的所有文件都在config
目录中,因此,如果更改的文件在config
目录中,它将需要重新启动Rails.
然后,Rails开始监视每个目录下的所有文件(默认情况下,app
中的每个目录),以判断它们是否发生了更改.它还专门监视config/routes.rb
文件的更改.
现在,Rails有了一个很好的路由配置,它知道应该响应哪些路径以及使用哪些控制器.一旦你点击其中一个配置的路由,Rails将运行你的控制器操作.
每当ruby看到一个它无法识别的常量时,它就会调用方法const_missing
.Rails重写此方法以获取常量的名称,并使用它在autoload_paths
的每个目录中搜索具有相同名称的文件.
当它找到文件时,它会动态地要求它,并假设它将定义触发const_missing
的常数,然后代码继续.
下次使用相同的常数时,它现在将被定义,所以它甚至不会达到const_missing
方法.
最后但并非最不重要的一点是,如果config cache_classes
设置为false
(开发环境中的默认值),那么每当Rails捕获到它正在监视的一个文件中的更改时,它就会取消设置与该文件相关联的常量(它从文件名中知道).
因此,每当您需要更改在第1步中加载的任何内容时(特殊处理的config/routes.rb
除外),都需要重新启动Rails.除此之外,Rails将通过自动加载机制重新加载,除非设置为缓存结果.
在生产环境中,默认情况下它还配置为预加载类,因此它将在启动服务器之前加载所有类.这是为了避免整个const_missing
、文件搜索和动态require
的开销.
非ruby文件,如assets资源 和视图,都是Rails在请求时读取的,因此您可以随时更改它们,而无需重新启动Rails.(注意:在生产环境中,assets资源 通常是预编译的,因此在app/assets
中更改assets资源 不会导致任何更改.但在请求时仍在加载,只是所讨论的文件是public
目录中的编译包).
当需要从一开始就重新加载Rails时,需要重新启动服务器.
如果要添加或删除gem,则需要重新启动服务器.
如果您更改了ruby的版本,更改了Gemfile,或者更改了Rails内部类中的某些内容,则需要重新启动它,否则应该可以.但是,如果出现意外问题,首先应该try 重启服务器.
另外,顺便说一句,如果将config.cache_classes
设置为false
(我认为这是开发的默认值,但不是生产的默认值),您只会看到在刷新页面时所做的更改.
编辑:
为了确保每个人都会注意到,塔德曼在 comments 中说了一件明智的事情,The general rule of thumb here is making changes to anything outside of app/ or config/routes.rb or db/ will require a restart.