我正在将Rails 3应用程序升级到Rails 4.我们有几个服务器和一个大型代码库,因此我将一小部分流量发送到Rails 4服务器以测试它是否正常工作。
我遇到的一个问题是,在编译资产时,Rails 4版本会生成与Rails 3应用程序不同的资产哈希值。新哈希值为twitter-df693e1c56dc88f61e60a2ad023eb024.js
,而旧版应用中为twitter-7899bccf144efec6f5064e6b54b42be9.js
。
发生这种情况时,来自Rails 4服务器的资产链接引用Rails 3服务器上不存在的文件,反之亦然(此问题因CDN缓存而加剧)。
是否可以使哈希保持一致?据我所知,两个应用程序都应该使用MD5进行摘要:
Rails 4 app:
config.assets.configure do |env|
puts "Digest class = #{env.digest_class}" # Digest class = Digest::MD5
end
不确定如何检查Rails 3应用程序上的摘要类,但我认为该版本的Sprockets默认为MD5。
相关版本信息:
Rails 4 app:
sprockets (2.11.3)
sprockets-rails (2.0.1)
rails (4.0.5)
Rails 3 app:
sprockets (2.2.3)
turbo-sprockets-rails3 (0.3.14)
rails (3.2.19)
Ruby:2.1.2
答案 0 :(得分:0)
Sprockets生成的哈希部分基于其自己的版本:
# Returns a `Digest` instance for the `Environment`.
#
# ...
#
# The value also provides a seed digest for all `Asset`
# digests. Any change in the environment digest will affect all of
# its assets.
def digest
# Compute the initial digest using the implementation class. The
# Sprockets release version and custom environment version are
# mixed in. So any new releases will affect all your assets.
@digest ||= digest_class.new.update(VERSION).update(version.to_s)
# Returned a dupped copy so the caller can safely mutate it with `.update`
@digest.dup
end
所以我认为不可能在版本之间获得一致的哈希值。
我出于好奇而尝试覆盖Sprockets版本常量(Sprockets::VERSION = '2.2.3'
),但是没有获得与旧版本的当前应用程序相同的哈希值,所以我认为其他一些东西也必须要去生成哈希。
我目前的计划是在生产中运行2个版本的Sprockets时关闭我们的CDN和资产摘要。