Rails:如何在不同版本的Sprockets中处理不同的哈希值?

时间:2014-11-11 04:49:45

标签: ruby-on-rails ruby-on-rails-4 hash sprockets

我正在将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

1 个答案:

答案 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和资产摘要。