Rails 5.2 服务器在不预编译资源时挂起



自从我们将项目的依赖项从rails 4.2升级到rails 5.2以来,我们遇到了一个问题

我们同时使用Sprockets资产和Webpacker。首次启动服务器并加载第一页(任何页面(时,它会在提供页面内容之前挂起。

它通常挂在这样的一行上,没有其他输出:

I, [2020-05-15T10:28:20.828146 #66077]  INFO -- : [fd7f1413-7d72-402f-92f9-95688e7fa50e]   Rendered partials/_front_page_featured_items.html.haml (172.4ms)

红宝石进程似乎处于空闲状态,没有使用 CPU。

我意识到,通过在运行服务器之前运行rails assets:precompile,即使我删除了 public/assets 和 public/packs 目录中的预编译资产,它也不会再挂起了。

我可以通过以下方式重现它:

  • 删除tmp/cache的内容

我们可以在至少 3 台开发机器和 CI 服务器上重现这一点。

在 rails 4.2 分支中,我们没有这个问题,我们有相同版本的 Webpacker (4.2.2(。

rails 4.2分支和 5.2 在资产方面的主要区别在于从 sprockets 3.7 升级到 4.0,以及所有其他依赖项更改。

我无法调试此问题,并希望在如何进一步调试此问题、获得更多日志输出等方面提供帮助。

更新:我在 gemfile 中禁用了网络打包程序,但它仍然冻结

更新#2:在链轮上发现了一个相关问题:https://github.com/rails/sprockets/issues/640。我相信这与我遇到的问题相同。

添加以下内容后,该问题似乎已得到解决:

if Rails.env.development? || Rails.env.test?
Sprockets.export_concurrent = false
end

application.rb

根据 https://github.com/rails/sprockets/issues/640 的说法,Sprockets 中存在一个错误,可能会发生死锁,这是一个解决方法。

最新更新