Rails Sprockets文件使用本地清单进行摘要而不是资产主机版本

时间:2018-05-29 20:34:48

标签: ruby-on-rails manifest sprockets

在我们使用Rails构建的Web应用程序中,我们有几个客户端使用相同的应用程序,这些客户端将使用不同的资产,具体取决于使用哪个子域。

为了达到这个目的,我们换掉CDN上正在使用的文件夹,如下所示:

config.action_controller.asset_host = Proc.new { |source, request|
  if request.subdomain.present?
    "http#{request.ssl? ? 's' : ''}://cdn.domain.com/#{request.subdomain}/"
  else
    "http#{request.ssl? ? 's' : ''}://#{request.host_with_port}/"
  end
}

每次我们创建一个新客户端时,我们都会使用自定义构建工具手动编译资产,该工具使用Sprockets以与Rails相同的方式构建资产,然后将它们上传到与子域匹配的文件夹下的CDN。这使我们可以完全基于子域拥有不同的资产集。

现在这个工作正常,但是当我们更新资产时,摘要将针对该文件进行更改,但Rails仍会尝试加载旧资产摘要,因为sprockets-manifest文件(位于/ public / assets中)例如正在加载 .sprockets-manifest-12345.json 而不是CDN上的那个。即使资产主机不同,它仍会加载本地资产。

Rails似乎并不关心其他清单文件,因为文件本身只将文件名存储到指纹版本中,因此即使主机等内容发生变化,它通常也能找到正确的资产。看起来好像是故意以这种方式设计Rails。

但是,我们确实需要让Rails使用CDN本身的清单文件,而不是使用应用程序本地公共文件夹中的清单文件。

阅读完文档后,您似乎可以更改清单位置。我们尝试使用与上面相同的逻辑来执行此操作,如下所示:

  config.assets.manifest = Proc.new { |source, request|
    if request.subdomain.present?
      "http#{request.ssl? ? 's' : ''}://cdn.domain.com/#{request.subdomain}/"
    else
      "http#{request.ssl? ? 's' : ''}://#{request.host_with_port}/"
    end
  }

但是Rails / Sprockets仍在使用本地sprockets文件...任何想法为什么?

0 个答案:

没有答案