【问题标题】:Rails 5 on Vagrant is caching classes in development modeVagrant 上的 Rails 5 正在开发模式下缓存类
【发布时间】:2019-10-31 15:09:29
【问题描述】:

我正在 Vagrant 虚拟机上运行一个简单的 Rails 5 应用程序。我只生成了一个名为 Blog 的脚手架,它正在工作。

然而,对类的任何手动更改都需要重启 Rails 服务器才能生效,尽管处于开发模式。

编辑:在尝试了许多其他有缺陷的解决方案之后,我已经发布了一个对我有用的答案,对于那些想要跳过的人......

Blog脚手架文件全部创建成功,可以使用索引、编辑等路由查看页面。但是如果我将BlogsController中的索引方法中的@blogs = Blog.all更改为@blogs = Blog.limit(1)并刷新浏览器,视图不会改变。仍然列出所有博客文章。

我查看了本地目录和 vm 上的目录。他们匹配。所以更改在服务器上。

我关闭并重新启动了以@blogs = Blog.limit(1) 作为索引方法内容的Rails 服务器,页面按预期加载,出现了一篇博文。

如何在不重新启动服务器的情况下让 rails 应用程序显示更新的内容?默认情况下是否有一些缓存可以关闭?我使用 RubyMine 作为我的 IDE,但我没有部署设置,也没有打开任何特殊缓存。我在另一个 Rails 项目(运行 Ruby 2.0.0 和 Rails 4.1.4)上使用了 RubyMine 和 Vagrant,没有这个问题。

Rails 版本 5.2.3

Ruby 版本 2.4.1p111 或 2.6.3p62(均无效)

RubyMine 2019.1 版

Vagrant 正在使用 VirtualBox 并运行 Ubuntu 18.04.2 LTS

根据其他帖子,这是生产环境的默认行为。我在命令行上尝试了echo $RAILS_ENV,但返回null。

我将<%= Rails.env %> 添加到“...blogs/index.html.erb”,它在浏览器中显示“开发”。所以应用程序环境设置正确,但它仍在缓存类(或其他东西)。 Rails 5 有什么地方默认将 vm 视为远程(生产)服务器,即使它显示为 Rails.env 变量的“开发”?

这是启动 rails 服务器后的相关控制台输出:

=> Booting Puma
=> Rails 5.2.3 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
 * Version 3.12.1 (ruby 2.4.1-p111), codename: Llamas in Pajamas
 * Min threads: 5, max threads: 5
 * Environment: development
 * Listening on tcp://0.0.0.0:3000

我尝试过的事情:

  • 我已清除浏览器缓存并运行rake tmp:cache:clear。不 效果。

  • 在文件 'config/environments/development.rb' 中, 'config/environments/test.rb', 'config/environments/production.rb' 我设置了这些属性:

config.cache_classes = false
config.action_controller.perform_caching = false 

并重新启动 rails 服务器。没有效果。

  • 我已从 2.4.1p111 切换到 Ruby 版本 2.6.3p62。没有效果。

  • 我关闭了 RubyMine 并在 SublimeText 中编辑了“blogs_controller.rb”。不 效果。

  • 我编辑了“app/views/blogs/index.html.erb”并刷新了浏览器 窗口而无需重新启动服务器,并且对视图的更改是 立即反映。所以这不是缓存所有内容的问题。

  • 在我的 Vagrantfile 中添加了以下内容,以加强同步访客和主机时钟的设置,并重新升级 vagrant:

config.vm.provider 'virtualbox' do |v|
    v.customize ["guestproperty", "set", :id, "--timesync-set-threshold", 5000] # Sync time every 5 seconds so Rails code reloads properly
    v.customize ["guestproperty", "set", :id, "--timesync-interval", 10000]     # Specifies interval at which to synchronize time with the host. Default is 10000ms (10 seconds).
    v.customize ["guestproperty", "set", :id, "--timesync-min-adjust", 100]     # The minimum absolute drift value measured in milliseconds to make adjustments for. The default is 1000 ms on OS/2 and 100 ms elsewhere.
    v.customize ["guestproperty", "set", :id, "--timesync-set-on-restore", 1]   # Set the time after the VM was restored from a saved state when passing 1 as parameter. This is the default.
end

没有效果。

  • 重新安装了 Ruby、Rails 和所有其他 gem。没有效果。
  • 在 Vagrantfile 中,更改了 vagrant 正在使用的同步文件夹的文件类型并设置了 dhcp 专用网络连接:
config.vm.network "private_network", type: "dhcp"
config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['actimeo=1']

没有效果。

  • 在 Vagrantfile 中,确保客户机正在获取主机时钟数据:
v.customize ["setextradata", :id, "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled", 0]

没有效果。

这似乎是一个类似的问题,op 在 Mac OS X 上使用 Docker:Dockerized Rails 5 RC1 application not picking up updates to controllers and models in development,但我没有使用任何特殊的部署或配置,只是一个 Vagrant vm。

这是另一个类似的问题,但 Rails 5 中不存在已接受答案中的配置设置:Rails Server needs restart every time I make changes? why?。其中一个 cmets 提到了一个老问题,即 Vagrant 来宾和主机时钟不同步可能会破坏 Rails 的重新加载。要去调查这种可能性。 编辑:调整了 VirtualBox 时钟同步设置,确认来宾和主机上的时钟是同步的(当我在每台机器上运行 date 时它们在 3 秒内 - 这似乎仍然关闭,但它们是关闭)。没用。

【问题讨论】:

    标签: ruby-on-rails ruby vagrant ruby-on-rails-5


    【解决方案1】:

    在另一个帖子上找到答案:https://stackoverflow.com/a/36616931/1512790

    ActiveSupport::EventedFileUpdateChecker 没有检测到文件更改,无论我对时钟同步、文件类型等进行了哪些更改。

    解决办法是:在'config/environments/development.rb'中,替换这一行

    config.file_watcher = ActiveSupport::EventedFileUpdateChecker
    

    用这个:

    config.file_watcher = ActiveSupport::FileUpdateChecker
    

    无论出于何种原因,FileUpdateChecker 类在 EventedFileUpdateChecker 不起作用时在 vm 环境中工作。

    为这个解决方案向pocari 大喊大叫。

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多