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

时间:2011-09-25 14:39:40

标签: ruby-on-rails ruby ruby-on-rails-3 deployment asset-pipeline

我刚从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相关文件没有按预期加载:如果我尝试访问它们,它们的内容为空\空(我可以在为我的应用程序网页生成的源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.custom目录中的jquery-ui-1.8.14.custom_redefinitionpublic/assets文件 按预期生成


可能问题与require_tree .文件中的app/assets/stylesheets/application.css.scss语句无关,该语句无法加载vendor/assets/stylesheets目录中的文件。

1 个答案:

答案 0 :(得分: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提供(并编译)到一个文件中。当您运行预编译时,由于Rails中的错误,UI文件最终会出现在/ assets目录中,所以不要依赖它(它将在Rails 3.1.2中修复)

您需要做的第二件事是将图像(如果尚未这样做)移动到资源/图像中。

第三件事是将扩展名.erb添加到stylesheets文件夹中的UI文件:

jquery-ui-1.8.14.custom.css.erb

最后一件事是更改CSS文件中对图像的所有引用以使用asset_path帮助程序。由此:

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

到此:

url(&lt;%= asset_path('ui-bg_gloss-wave_35_f6a828_500x100.png')%&gt;)

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

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

对于生产来说,事情变得有点棘手。您应该坚持使用默认值,即将所有资产预编译到公共的/ assets目录。

我会检查管道指南的last section,并确保所有配置文件都符合示例中的设置。

最后一件事是确保您有Capistrano设置为您运行预编译作业。请查看指南的precompiling assets部分,了解有关如何进行设置的信息。

这应该让事情再次发挥作用。

您可以(作为不使用这些图像的管道的替代方法)将UI文件移动到/ public下的目录中,并从CSS访问它们。您需要更改所有图像引用。既然你必须改变它们,我会坚持使用管道方式。