【问题标题】:Rails asset pipeline on staging: correct fingerprint but 404ing暂存的 Rails 资产管道:指纹正确但 404ing
【发布时间】:2013-08-23 14:20:09
【问题描述】:

我正在运行 Rails 3.1.3,其中包含 Sprockets 2.0.3 作为依赖项。

我将我的暂存环境设置为按照 Rails 指南建议的生产方式进行配置。

config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true

我已包含在我的 Capfile 中

load 'deploy'
load 'deploy/assets'

资产在部署时按预期进行预编译。

在 public/assets 中,我按预期找到了带有指纹的资产。

application-bd402855d34fb61e0a1690da06f79f20.js
application-bd402855d34fb61e0a1690da06f79f20.js.gz
application-ed3f9a8d23992790841c11b6692fb576.css
application-ed3f9a8d23992790841c11b6692fb576.css.gz
...and a bunch of images...

当我加载页面时,我会看到正确的引用、指纹和所有内容。

<link href="/assets/application-ed3f9a8d23992790841c11b6692fb576.css" media="screen" rel="stylesheet" type="text/css">
<script src="/assets/application-bd402855d34fb61e0a1690da06f79f20.js" type="text/javascript"></script>

然而,404s、css、js、图片,应有尽有。

有人知道这里的交易是什么吗?谢谢!

【问题讨论】:

  • 您是作为“生产”运行 staging 还是有 staging.rb 配置文件?如果是这样,您可能没有正确的管道选项。
  • Staging 是使用上面的配置选项设置的,这与 Rails 指南建议的生产环境相同。我想要几乎相同的行为。不对吗?
  • 应该没问题。我会再考虑一下...
  • 我在生产模式下也有同样的问题。使用完全相同版本的 rails ruby​​ 和 sprocket 在本地进行测试。
  • 您是否尝试过在预编译之前执行 rake assets:clean ?您的登台环境应该与您的生产环境相同,因为这是登台的全部意义所在。

标签: ruby-on-rails asset-pipeline production staging sprockets


【解决方案1】:

尽管在其他答案中有建议

config.assets.compile = true

...是一种解决方法,而不是解决方案。此选项使 Rails 能够回退到在 public/assets 中找不到的资产的即时编译。它可能会“解决”您的暂存问题,但让 Rails 在运行时编译资产在生产环境中并不是最佳的。

我记得在使用 Rails 3.1.x 中的新资产管道的最初几个月里,我遇到了压缩和生成摘要的问题,我只是在以后的版本中才真正解决了这些问题。我建议尝试一下

config.assets.compress = false
config.assets.digest = false

单独和一起。和/或升级到更高版本的 Rails 或资产管道 gem。

【讨论】:

    【解决方案2】:

    如果您确定资产正在编译并存在于公共目录中,可能是您的网络服务器设置吗?在生产/暂存环境中,资产不应命中 rails 应用程序,而应直接从 Web 服务器提供。这是一个示例 apache config sn-p:

       <LocationMatch "^/assets/.*$">
          Header unset ETag
          FileETag None
          # RFC says only cache for 1 year
          ExpiresActive On
          ExpiresDefault "access plus 1 year"
    
          SetEnv no-gzip
          RewriteEngine on
          # Make sure the browser supports gzip encoding before we send it
          RewriteCond %{HTTP:Accept-Encoding} \b(x-)?gzip\b
          RewriteCond %{REQUEST_FILENAME}.gz -s
          RewriteRule ^(.+) $1.gz [L]
    
       </LocationMatch>
    
       <FilesMatch \.css\.gz$>
          ForceType text/css
          Header set Content-Encoding gzip
       </FilesMatch>
    
       <FilesMatch \.js\.gz$>
          ForceType text/javascript
          Header set Content-Encoding gzip
       </FilesMatch>
    

    【讨论】:

      【解决方案3】:
      config.assets.compile = false
      

      应该是:

      config.assets.compile = true
      

      另外,请确保清除缓存:

      bundle exec rake tmp:cache:clear
      

      然后重启服务器。

      【讨论】:

        【解决方案4】:
        config.assets.compile = false
        

        应该是真的

        【讨论】:

          【解决方案5】:

          几个月前我遇到了同样的问题。出于几个原因,我选择在生产环境中手动触发资产编译,所以我的 production.rb 有

          config.assets.compile = false
          

          并且通过 capistrano 部署还具有预编译资产的任务(也使用 rvm):

          run "cd #{release_path} && RAILS_ENV=production bundle exec rake assets:precompile", shell: fetch(:rvm_shell)
          

          最后一步是确保我们对资产文件夹进行符号链接,这样我们就不需要重新编译未更改的资产。

          run "ln -nfs #{shared_path}/assets #{release_path}/public/assets"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-20
            • 2016-07-30
            • 1970-01-01
            • 2014-11-07
            • 2011-10-28
            • 1970-01-01
            相关资源
            最近更新 更多