【问题标题】:Rails: Why do asset fingerprints differ depending on where the assets are compiled?Rails:为什么资产指纹会根据资产的编译位置而有所不同?
【发布时间】:2014-04-17 07:47:26
【问题描述】:

我在跑步

RAILS_ENV=staging bundle exec rake assets:precompile

在两台不同的机器上,为相同的资产文件获取不同的指纹。我在两台机器上都安装了 Rails 4.0.2。这些机器是

  • Mac OS 10.9.2 和
  • Ubuntu Linux 12.04

资产编译在哪台机器上,指纹不应该是一样的吗?

编辑:Linux 机器是一个 EC2 实例。所以我制作了一个 AMI 并启动了第二个实例。在这个相同的实例上编译资产会产生与在原始实例上创建的相同的指纹。这似乎是我的开发机器的“问题”。

【问题讨论】:

  • 非常好的问题。我浏览了 sprockets,看不到摘要是在哪里生成的,所以现在我想知道。

标签: ruby-on-rails ruby-on-rails-4 asset-pipeline md5 fingerprint


【解决方案1】:

我在此处的相关帖子中找到了一些额外信息,这些信息可能与校验和的计算方式更相关:How does finger print digest gets calculated in Rails 4.2

我也在下面留下我原来的答案,因为我认为它仍然相关:

认为这是按设计工作的行为。自从提出这个问题以来,Sprockets 可能已经发生了变化,但我认为 this code comment 可能会解释原因:

    # 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,它们是相同的。

tldr;资产可能相同,但哈希似乎包含其他信息,这些信息可能因系统而异

【讨论】:

    【解决方案2】:

    一个可能的原因是同一文件在 Mac OS X 和 Linux 上的内容可能并不完全相同。在 Linux 和 Max OS X 中,换行符和回车符的处理方式不同。

    尝试在不同 Mac 上预编译资产进行相同的实验,以确认 Mac 是否生成相同的指纹。

    【讨论】:

    • 我尝试了两个不同的 Linux EC2 实例。两个实例上的指纹相同。受影响的文件不仅仅是文本文件。大多数是PNG文件。所以我想回车字符在这里应该无关紧要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多