部署(生产模式)时资产管道出现问题

3
我刚从Ruby on Rails 3.0.10升级到3.1.0,并且使用jQuery UI 1.8.14。我在远程机器上的生产模式中加载css文件时遇到了问题。
在我的app/views/layouts/application.html.erb文件中,我有:
<%= stylesheet_link_tag 'application', 'jquery-ui-1.8.14.custom', 'jquery-ui-1.8.14.custom_redefinition' %>
<%= javascript_include_tag 'application' %>

注意: jquery-ui-1.8.14.custom 文件是使用Theme Roller生成的CSS文件,而jquery-ui-1.8.14.custom_redefinition是我的“自定义重新定义”文件,覆盖了一些CSS类。这些文件(都是扩展名为.css)位于vendor/assets/stylesheets

在我的本地机器上处于开发模式时,一切似乎都正常,但是当我使用Capistrano部署到远程机器时,它不再起作用。也就是说,jQuery UI相关文件没有按预期加载:如果我尝试访问它们,它们的内容为空(我可以在生成的应用程序Web页面的源HTML代码中看到它们)。

我该如何解决这个问题?


此时,在我的config/environments/production.rb文件中有:

# Compress JavaScripts and CSS
config.assets.compress = true

# Don't fallback to assets pipeline if a precompiled asset is missed
#
# Note: Since, at this time, the asset Pipeline doesn't work for me I am 
# following the "Live Compilation" approach (more info at
# http://guides.rubyonrails.org/asset_pipeline.html#in-production)
config.assets.compile = true

# Generate digests for assets URLs
config.assets.digest = true

在我的 app/assets/stylesheets/application.css.scss 文件中,我有以下内容:

/*
 *= require_self
 *= require_tree .
*/

在我的 app/assets/stylesheets/application.js 文件中,我有以下内容:
//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_tree .

部署前,我在本地机器上运行以下命令:

bundle exec rake assets:precompile

注意:如果我运行以上命令,则会如预期生成 jquery-ui-1.8.14.customjquery-ui-1.8.14.custom_redefinition 文件于 public/assets 目录中。
也许问题与 app/assets/stylesheets/application.css.scss 文件中的 require_tree . 语句有关,该语句无法加载 vendor/assets/stylesheets 目录中存在的文件。
1个回答

7

这里有几个问题,我将分别处理每个问题。

为什么出现问题

在生产模式下开启摘要时,访问资源的方式与开发模式不同。在开发中,一切正常。Sprockets使用其未摘要的文件名在app/assets下提供服务。这基本上就像没有Sprockets一样,但请记住/assets是一个挂载点(Sprockets是Rails引擎),因此所有位于该挂载点下的文件都是通过Sprockets提供服务的。

在生产中,会使用带有摘要的文件名,因此Sprockets期望请求这些名称而不是原始名称。它们实际上被隐藏在/assets挂载点后面。

如何解决

第一件事是将application.css更新为以下内容:

/*
 *= require_self
 *= require jquery-ui-1.8.14.custom'
 *= jquery-ui-1.8.14.custom_redefinition:
*/

并将样式表链接标记更新为以下内容:

<%= stylesheet_link_tag 'application' -%>

这样可以确保您的CSS被编译成一个文件。当您运行precompile UI文件时,由于Rails中的一个bug,它们最终会出现在/assets目录中,因此不要依赖它(这将在Rails3.1.2中修复)。
第二件事是将图像(如果还没有这样做)移动到assets/images中。
第三件事是在stylesheets文件夹中的UI文件上添加扩展名.erb:

jquery-ui-1.8.14.custom.css.erb

最后一件事是将CSS文件中所有对图像的引用更改为使用asset_path帮助程序。从这个开始:

url(images/ui-bg_gloss-wave_35_f6a828_500x100.png)

转化为:

url(<%= asset_path('ui-bg_gloss-wave_35_f6a828_500x100.png') %>)。

在开发模式下运行测试,它应该可以正常工作。

在生产模式下,帮助程序将普通文件名替换为正确的指纹文件名,因此可以访问资源。

对于生产环境,需要注意一些细节。您应该坚持默认设置,即将所有资产预编译到/public/assets目录中。

我会检查管道指南的最后一节,确保所有配置文件与示例中的设置匹配。

最后一件事是确保您已经设置了Capistrano来运行预编译作业。有关如何设置的信息,请参阅指南中的预编译资产部分。

这样应该可以使事情重新开始工作。

作为另一种不使用管道的图像处理方案,您可以将UI文件移动到“/public”目录下,并从CSS中访问它们。您需要更改所有图像引用。既然您必须进行更改,我建议仍使用管道方式。

我在使用Capistrano时遇到了一个问题,即在部署时使用load 'deploy/assets'以进行预编译资产:https://dev59.com/plvUa4cB1Zd3GeqPvZ85。Ruby on Rails资产管道指南中解释的服务器配置怎么样?顺便说一句,Rails 3.1.2中将解决哪个错误? - Backo
我不确定为什么Cap不起作用,但是关于服务器配置,这是最佳实践而非强制性的。如果不这样做,您将失去远期标头缓存的好处,但它仍然应该可以工作。 - Richard Hulse

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