【问题标题】:How do I get the Rails server to refresh precompiled assets?如何让 Rails 服务器刷新预编译资产?
【发布时间】:2014-04-20 12:58:05
【问题描述】:

我正在使用内置 Webrick 服务器在我的 localhost:3000 上的生产环境中测试我的 Rails 4 应用程序。当我运行RAILS_ENV=production bundle exec rake assets:precompile 时,资产会在公共环境中重建,并且清单也会重建,但页面仍然使用以前的资产名称提供服务。

重新启动 rails 服务器会使新资源出现。有没有一种不太极端的方法来实现这一点,当我将它移植到运行 Phusion Passenger 的生产服务器时,它会如何表现。我真的不想重启 Apache 来让我的资产运转起来。

【问题讨论】:

  • 是否为编译的资产启用了指纹识别?
  • 是的,编译的资产是指纹的。配置是默认的 Rails 4,除了设置了 config.serve_static_assets = true,这是让 Webrick 从 /publicconfig.assets.digest = true 提供资产所需的设置。这些资产的名称类似于application-01d7312dee865ebe9d525b15f2fbe7f0.css,这是页眉中的值。问题是新版本建好后还在使用旧版本。
  • 旧版本的意思是,你改过内容吗?如果你没有改变assets的内容,预编译的版本会和之前的一样,如果你稍微改变一下,指纹就会改变,app会根据你设置的config.assets.digest = true请求新的.

标签: ruby-on-rails ruby-on-rails-4 asset-pipeline


【解决方案1】:

如果您没有更改资产的内容,预编译版本将与之前的版本相同。如果你稍微改变一下,指纹就会改变,应用程序只会请求新的指纹,因为你设置了config.assets.digest = true

无论如何,另一种解决方法是:

只要运行:

rake assets:clean

然后,

rake assets:precompile

这使得资产管道中的所有内容都可以重新构建和服务。

Rails 会在编辑每个文件的内容时自动清除其缓存。

如果以上任何一个都不起作用,请尝试如下:

config.serve_static_assets = trueconfig/environments/production.rb

config.serve_static_assets 将 Rails 本身配置为提供静态资源。默认为 true,但在生产环境中被关闭,因为用于运行应用程序的服务器软件(例如 Nginx 或 Apache)应该提供静态资产。与默认设置不同,在运行(绝对不推荐!)或使用 WEBrick 在生产模式下测试您的应用程序时将其设置为 true。否则,您将无法使用页面缓存,并且对公共目录下定期存在的文件的请求无论如何都会影响您的 Rails 应用程序。

参考:http://guides.rubyonrails.org/configuring.html#rails-general-configuration

希望对你有帮助:)

【讨论】:

  • 感谢您的回答,但是,当然,我修改了内容,我尝试了rake assets:cleanrake assets:clobberserve_static_assets = true。在发布到这里之前,我已经阅读了几乎所有在线指南以寻找答案。我认为这实际上可能是某种缓存问题。
  • @PeterWooster 您是否尝试过手动删除public/assets 的内容,看看会发生什么?
  • @roshiro 删除公共/资产使网站看起来像 1996 年,没有样式没有 javascript。
【解决方案2】:

我们遇到了同样的问题,即使在尝试了 rake assets:clean 或 assets:clobber 后仍会提供旧资产,最终服务器重新启动将解决该问题。在我们的案例中,罪魁祸首是独角兽。在使用 mina 和 mina-unicorn 部署我们的 rails 应用程序时,我们运行了 rake assets:clobber,然后编译了 assets,最后重新启动了 unicorn。通过这样做,独角兽大师永远不会停止并继续展示旧资产。所以,我们改变了我们的 mina 部署脚本,而不是重新启动 unicorn,我们停止了 unicorn 并重新启动它。这解决了这个问题。所以,关键步骤是

  1. 部署应用程序

  2. 运行 rake assets:clobber

  3. 运行 rake assets:precompile

  4. 停止独角兽

  5. 启动独角兽

这扼杀了零停机时间的概念,但这是比重新启动服务器更好的解决方案。

我了解您使用乘客,但此信息可能对其他人有所帮助

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    相关资源
    最近更新 更多