我注意到,当我更改 rails 项目文件(例如 ahtml.erb
或.css
)时,我不必使用该rails -s
命令重新启动服务器。
但我认为当我想安装一个新的 gem 时,我必须这样做。问题是我试图让 jQuery 工作,所以我厌倦了一直这样做rails -s
。
谁能告诉我当rails -s
我修改我的应用程序时我什么时候必须再次运行,我什么时候可以不这样做?不这样做,我的意思是简单地刷新网页以查看更改。
我注意到,当我更改 rails 项目文件(例如 ahtml.erb
或.css
)时,我不必使用该rails -s
命令重新启动服务器。
但我认为当我想安装一个新的 gem 时,我必须这样做。问题是我试图让 jQuery 工作,所以我厌倦了一直这样做rails -s
。
谁能告诉我当rails -s
我修改我的应用程序时我什么时候必须再次运行,我什么时候可以不这样做?不这样做,我的意思是简单地刷新网页以查看更改。
由于这个答案是我在 StackOverflow 上最明显的答案,而且它已经很老了,我认为是时候更新它以更深入地了解它了。它的原始信息并没有错误,但它有点过于笼统,我觉得我可以用我现在的知识更好地解释它。原始答案保留在下面。
Rails 与普通 ruby 相比的工作方式是,它基本上需要您的文件即时运行,而无需require
在文件顶部添加 s。现在在官方 Rails 指南上有一个很好的相对深入的页面。
从 Rails 6 开始,他们引入了一个新的加载器来管理自动加载源文件的逻辑,将工作卸载到一个名为zeitwerk的 gem 。Rails 指南上还有一个页面解释了新加载器的工作原理。
基本思想是这样的:
Rails 运行一堆配置文件(environment.rb
, application.rb
, boot.rb
, 各自的environments/<environment>.rb
, config/routes.rb
, 初始化程序等)。在此启动阶段运行的所有文件都在config
目录中,因此如果更改的文件在config
目录中,则可能需要重新启动 Rails。
然后 Rails 开始查看每个文件下的所有文件autoload_paths
(默认情况下每个 dir inside app
)以检查它们何时发生变化。它还专门监视config/routes.rb
文件的更改。
现在有了一个很好的路由配置,Rails 知道响应哪些路径以及使用哪些控制器。一旦你点击了配置的路线之一,Rails 将运行你的控制器动作。
每当 ruby 看到一个它无法识别的常量时,它就会调用 method const_missing
。Rails 会覆盖此方法以获取常量的名称,并使用它在autoload_paths
.
当它找到该文件时,它会即时要求它,假设它将定义触发 的常量,const_missing
然后代码继续运行。
下次使用相同的常量时,它现在将被定义,因此它甚至不会到达const_missing
方法。
最后但并非最不重要的一点是,如果配置cache_classes
设置为false
(开发环境中的默认设置),那么每当 Rails 捕获它正在监视的文件之一中的更改时,它将取消设置与文件关联的常量(它从名称中知道文件)。
因此,当您需要更改在该步骤 1 中加载的任何内容时,除了经过特殊处理的 之外config/routes.rb
,您需要重新启动 Rails。除此之外,Rails 将通过该自动加载机制重新加载,除非它被设置为缓存结果。
在生产环境中,它还默认配置为预加载类,因此它会在启动服务器之前加载所有类。这是为了避免整体const_missing
、文件搜索和动态require
事物的开销。
非 ruby 文件,如资产和视图,在请求时都会被 Rails 读取,因此您可以随时更改它们而无需重新启动 Rails。(注意:在生产环境中资产通常是预编译的,所以改变里面的资产app/assets
不会导致任何改变。但是在请求时它仍然在加载,只是有问题的文件是public
目录内的编译包)。
当您需要从头开始再次加载 Rails 时,您需要重新启动服务器。
如果您要添加或删除 gem,那么是的,您需要重新启动服务器。
如果你改变你的 ruby 版本,改变你的 Gemfile 或者从 Rails 的内部类中改变一些东西,你需要重新启动它,否则应该没问题。但是,如果出现意外问题,您应该首先尝试重新启动服务器。
config.cache_classes
此外,在旁注中,如果设置为false
(我认为这是开发的默认设置,但不是生产的默认设置),您只会看到刷新页面的更改。
编辑:
为了确保每个人都会注意到,tadman 在评论中说了一件明智的事情,这里的一般经验法则是对 app/ 或 config/routes.rb 或 db/ 之外的任何内容进行更改将需要重新启动。
在开发中,您需要在以下情况下重新启动:
Gemfile
.rvm
.config/
,但routes.rb
会为您重新加载。require
手动更改任何文件,而不是自动加载。在生产中,您需要在以下情况下重新启动:
注意如果需要,可以通过编辑相应的environment/<env>.rb
文件来更改这些行为,尽管默认值是合理的。
每当安装或更新 gem、升级 ruby 或更改启动期间运行的某些逻辑(如 config/boot.rb 或 config/database.yml)时,通常都需要重新启动服务器。否则,即使您编辑/添加模型/控制器,通常也可以不这样做。
旁注:jquery-rails gem使将 jquery 添加到项目中变得容易。