【问题标题】:Trouble with the Asset Pipeline on deploying (production mode)部署时资产管道出现问题(生产模式)
【发布时间】:2011-09-25 14:39:39
【问题描述】:

我刚刚从 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.customjquery-ui-1.8.14.custom_redefinition 文件会按预期在public/assets 目录中生成。


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

【问题讨论】:

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


    【解决方案1】:

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

    为什么会损坏

    在启用摘要的生产和开发模式中访问资产的方式有所不同。在开发中,一切正常。 Sprockets 以未消化的文件名提供应用程序/资产下的内容。这几乎就像没有 Sprockets 一样工作,但请记住 /assets 是一个挂载点(Sprockets 是一个 Rails 引擎),所以它下面的文件都是 通过 Sprockets 提供的。

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

    如何解决这个问题

    第一件事是将你的 application.css 更新为:

    /* *= 要求自我 *= 需要 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添加到样式表文件夹中的UI文件中:

    jquery-ui-1.8.14.custom.css.erb

    最后一件事是将 CSS 文件中对图像的所有引用更改为使用asset_path 帮助器。从此:

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

    到这里:

    url()

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

    在生产模式下,帮助程序将正常文件名替换为正确的指纹名称,以便可以访问资产。

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

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

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

    这应该可以让事情重新开始。

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

    【讨论】:

    • 我在 Capistrano 使用 load 'deploy/assets' 以便在部署时 预编译资产 时遇到问题:stackoverflow.com/questions/7549214/…。 Ruby on Rails 资产管道指南中解释的 服务器配置 怎么样? 顺便说一句:Rails 3.1.2 中将解决的错误呢?
    • 我不确定 Cap 为何不工作,但关于服务器配置,这是最佳实践,但不是强制性的。如果没有你失去远期标头的缓存优势,但它仍然可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多