在最小化的Rails 4网站中,由asset:precompile生成的文件与stylesheet_link_tag生成的URL不匹配(缺少摘要)。

12

我正在使用 Ruby 2.0.0-p247Rails 4.0.0

如果我像这样创建一个最小的Rails 4网站:


如果我创建一个最简化的Rails 4网站,如下所示:

rails new minimal
cd minimal
rails generate controller home index
tee config/routes.rb <<EOF
Minimal::Application.routes.draw do
  root 'home#index'
end
EOF

然后使用以下命令预编译资产:

Then precompile the assets with

rake assets:precompile

它会生成类似以下的资产:

I, [2013-09-04T17:05:36.992951 #3549]  INFO -- : Writing /WORKINGDIR/minimal/public/assets/application-723d1be6cc741a3aabb1cec24276d681.js
I, [2013-09-04T17:05:37.052303 #3549]  INFO -- : Writing /WORKINGDIR/minimal/public/assets/application-f1a14051f17824976271b9c0460232f0.css

但如果我以生产模式启动服务器,使用

RAILS_ENV=production rails s

生成的HTML中的URL没有指向预编译文件:

<link data-turbolinks-track="true" href="/stylesheets/application.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/javascripts/application.js"></script>

我倒是希望:

<link data-turbolinks-track="true" href="assets/application-f1a14051f17824976271b9c0460232f0.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-723d1be6cc741a3aabb1cec24276d681.js"></script>

默认情况下,config/environments/production.rb设置为使用摘要:

config.assets.digest = true

但是似乎有选择地被忽略了?

我错过了什么吗?

更新:

我在Rails 4.2.3中进行了测试,这个问题似乎已经解决了。然而,我们需要将一些环境变量传递到rails s命令中以启动生产模式:

SECRET_KEY_BASE=$(rake secret) RAILS_SERVE_STATIC_FILES=true RAILS_ENV=production rails s
2个回答

12

我在撰写这个问题的时候,发现了一篇博客文章,该文章认为这是一个bug。

http://railsblog.kieser.net/2013/08/rails4-phusion-passenger-asset-pipeline.html

在各种建议中,仅仅将编译回退设置为true就可以解决问题......

config.assets.compile = true

似乎足以激活Rails生成适当摘要的URL:

<link data-turbolinks-track="true" href="/assets/application-f1a14051f17824976271b9c0460232f0.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-723d1be6cc741a3aabb1cec24276d681.js"></script>

另一个建议是明确设置RAILS_ENV和RAILS_GROUPS,似乎会在预编译的文件上产生不同的摘要字符串,但它们始终与生成的HTML相匹配。


我通常设置RAILS_ENV=production。这似乎是从3.2.x开始的一个退步 :( - Gabe Kopley
3
我认为在生产环境下,config.assets.compile = true 会影响性能。 - Johann
@Johann 如果你在部署时仍然执行 rake assets:precompile(就像 config.assets.compilefalse 一样),那么实际上永远不会触发实时重新编译代码(因为它总是会看到预编译版本并提供服务)。 - pix
1
@pix - 除非由于某种原因,某些资产未与预编译一起编译。最终,如果config.assets.compile = true在生产中对您有所帮助,则是以性能为代价的。我的应用程序在生产中存在巨大的延迟问题(+35秒视图渲染!!)感谢config.assets.compile = true。结果发现Rails仅预编译application.css和application.js,并在运行时编译其他文件(导致延迟)。我的解决方案是:config.assets.precompile +=%w(application * .css application * .js application * .scss) - joshblour

0

我通过提高资产版本号来解决未包含摘要的资产链接问题。

     # Version of your assets, change this if you want to expire all your assets
-    config.assets.version = '1.0'
+    config.assets.version = '2.0'

如果你正在升级,你可以在config/application.rb中找到这个文件;如果你使用的是更新版本,则可以在config/initializers/asset.rb中找到。


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