Rails:为什么资产指纹取决于资产编译的位置不同?

7
我正在运行。
RAILS_ENV=staging bundle exec rake assets:precompile

在两台不同的机器上编译相同的资产文件,却得到不同的指纹。我在这两台机器上都安装了Rails 4.0.2。这两台机器分别是Mac OS 10.9.2和Ubuntu Linux 12.04。无论资产文件在哪台机器上编译,指纹是否应该都是相同的呢?
编辑:Linux机器是EC2实例。我制作了一个AMI并启动了第二个实例。在此相同的实例上编译资产会得到与在原始实例上创建的相同的指纹。这似乎是我的开发机存在的“问题”。

2
真的是个好问题。我翻看了一下 Sprockets 的代码,但是没找到生成摘要的地方,所以现在我很想知道。 - sevenseacat
2个回答

1

我在这里找到了一篇相关的帖子,其中包含了关于校验和如何计算的更多信息,可能更加相关:Rails 4.2中指纹摘要是如何计算的

我仍然保留我的原始答案,因为我认为它仍然相关:

我认为这种行为是按设计工作的。虽然自问题被提出以来,Sprockets可能已经发生了变化,但我认为这段代码注释可能会解释原因:

    # Caveat: Digests are cached by the path's current mtime. Its possible
    # for a files contents to have changed and its mtime to have been
    # negligently reset thus appearing as if the file hasn't changed on
    # disk. Also, the mtime is only read to the nearest second. It's
    # also possible the file was updated more than once in a given second.

在我的macOS系统上:
pry > File.mtime("Rakefile").to_i
=> 1605021933

在一个远程的Linux服务器上,使用完全相同的文件:
pry > File.mtime("Rakefile").to_i
=> 1606847789

在我的情况下,我注意到我的文件的修改时间(mtime)会在本地(macos)因不明原因而被修改/更新。我认为这可能是由我使用的vim插件(fzf?索引工具?我还没有研究过)引起的。
如果对这两个文件进行MD5,则它们是相同的。
简而言之,这些资源可能是相同的,但哈希值似乎包括其他信息,可能因系统而异。

0
可能的一个原因是,在Mac OS X和Linux上,同一文件内容可能并不完全相同。在Linux和Mac OS X中,换行符和回车符的处理方式不同。
尝试在不同的Mac上预编译资产来确认这些Mac是否生成相同的指纹。

我尝试了两个不同的Linux EC2实例。这两个实例上都有相同的指纹。受影响的文件不仅仅是文本文件,大多数是PNG文件。因此,我想回车符在这里应该不重要。 - Jan Deinhard

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