我比较新的RoR,我很好奇为什么Rails编译资产有无md5哈希生产?
我运行bundle exec rake资产:clean然后绑定exec rake资产:precompile
我的production.rb文件:
MyApp::Application.configure do # Code is not reloaded between requests config.cache_classes = true # Full error reports are disabled and caching is turned on config.consider_all_requests_local = false config.action_controller.perform_caching = true # Disable Rails's static asset server (Apache or Nginx will already do this) config.serve_static_assets = false # Compress JavaScripts and CSS config.assets.compress = true # Don't fallback to assets pipeline if a precompiled asset is missed config.assets.compile = false # Generate digests for assets URLs config.assets.digest = true config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for Nginx config.assets.precompile += %w(tos.js,tos.css) config.i18n.fallbacks = true config.active_support.deprecation = :notify end
我的应用程序与名称中的散列文件一起使用,这在我的情况下应该是这样的:)
所以我有两个问题:
1)为什么编译时会发生?
Rails compiles assets both with and without md5 hash for production
2)这些文件是什么(没有哈希)?
也许我没有得到什么,所以请有人解释.
解决方法
它的原因是,您可以在不知道MD5指纹的情况下访问文件(例如,在非rails应用程序中,或rails应用程序中的未由rails堆栈编译或运行的文件(例如,500 / 502状态错误页面),在这种情况下,您必须编译资源,然后在每次更新代码时更改静态HTML文件中的css / js链接(从而导致MD5哈希更改).
因此,rails产生每个资产文件的2个副本,一个具有文件名中的指纹,另一个没有(例如application-731bc240b0e8dbe7f2e6783811d2151a.css和application.css).指纹版本明显优先(参见rails asset pipeline guide中的“what is fingerprinting and why should I care”).但不消化的版本是作为回退.
作为这个问题的最后一个想法,我将读取以下拉动请求到rails git repo:https://github.com/rails/rails/pull/5379,他们正在讨论未消化的文件名的优缺点,以及是否可以关闭编译的他们.
HTH