更新资产而不重启rails服务器

6

所以问题基本上可以归结为:

在生产环境的Rails中,如何有效地处理变化的资产而无需重新启动服务器?

我们遇到的问题是,我们必须重新启动运行应用程序的Thin服务器,才能提供更新后的JavaScript文件。

一些背景:

现在,我们每小时从几个长时间运行的任务中生成数据,并将其保存在JavaScript文件中,以便在Rails应用程序中使用。
需要明确的是,我们更新/覆盖现有文件,而不是添加新文件。

生成后,我们运行以下命令,以重新编译所有资产。

bundle exec rake assets:precompile
bundle exec rake rails_group=assets assets:clean RAILS_ENV=production

即使清除浏览器缓存并重新加载页面,我们仍然会被提供旧资产。

你们有没有类似的经验?你们是如何解决的?

附:祝大家节日快乐!


在服务器 shell 上,在您的应用程序文件夹上执行 touch tmp/restart.txt - MurifoX
只有对于Passenger,触摸tmp/restart才有效,而不适用于Thin。 - systho
1
你的资源是否已经进行指纹处理或者在资源URL的查询字符串中使用了时间戳?(http://guides.rubyonrails.org/asset_pipeline.html#what-is-fingerprinting-and-why-should-i-care)如果你没有使用这些技术,那么很可能会出现过期资源的情况。你可以尝试实时编译而不是每小时都运行预编译,只需要进行清理即可。 - systho
@systho,你说得很有道理,我甚至没有考虑过禁用资产管道。这可能会解决问题。 - deRailed
2个回答

2
所以,我们最终做的就是让Rails通过在config/environments/production.rb中设置config.serve_static_assets = true来提供静态资产,并将经常更改的JavaScript数据文件放入public/目录结构下。这样做非常好,因为它还将资产和数据分开存放在不同的位置。

0
根据Rails指南的说法:
Sprockets使用默认的Rails缓存存储来在开发和生产环境中缓存资源。
除非你告诉Rails不要缓存它们,否则Rails将会缓存你的资源。资产管道的整个目的是通过鼓励浏览器、服务器和Rails服务器自身缓存资源来尽快提供资源。
如果你的使用情况经常涉及重新制作资源,也许资产管道并不适合你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接