Bac*_*cko 3 ruby deployment ruby-on-rails ruby-on-rails-3 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' %>
Run Code Online (Sandbox Code Playgroud)
注意:该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
Run Code Online (Sandbox Code Playgroud)
在我的app/assets/stylesheets/application.css.scss
档案中,我有:
/*
*= require_self
*= require_tree .
*/
Run Code Online (Sandbox Code Playgroud)
在我的app/assets/stylesheets/application.js
档案中,我有:
//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_tree .
Run Code Online (Sandbox Code Playgroud)
在部署之前,在我的本地计算机中,运行以下命令:
bundle exec rake assets:precompile
Run Code Online (Sandbox Code Playgroud)
注意:如果我运行上面的命令,jquery-ui-1.8.14.custom
并按预期在目录中生成jquery-ui-1.8.14.custom_redefinition
文件.public/assets
也许问题与文件中的require_tree .
语句有关,该语句app/assets/stylesheets/application.css.scss
不会加载目录中存在的vendor/assets/stylesheets
文件.
这里有一些问题,我将分别处理每个问题.
为什么会这样
在开启摘要的情况下,在生产和开发模式中访问资产的方式存在差异.在开发中,事情正常.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(<%= asset_path('ui-bg_gloss-wave_35_f6a828_500x100.png')%>)
在开发模式下运行它作为测试 - 它应该工作正常.
在生产模式下,帮助程序使用正确的指纹名称替换普通文件名,因此可以访问资产.
对于生产来说,事情变得有点棘手.您应该坚持使用默认值,即将所有资产预编译到公共的/ assets目录中.
我会检查管道指南的最后一部分,并确保所有配置文件都与示例中的设置相匹配.
最后一件事是确保您有Capistrano设置来为您运行预编译作业.检查指南的预编译资产部分,了解有关如何进行设置的信息.
这应该让事情再次发挥作用.
您可以(作为不使用这些图像的管道的替代方案)将UI文件移动到/ public下的目录中,并从CSS访问它们.您需要更改所有图像引用.既然你必须改变它们,我会坚持使用管道方式.
归档时间: |
|
查看次数: |
3798 次 |
最近记录: |