在config.assets.precompile中使用通配符时预编译资产问题

时间:2012-01-16 21:45:29

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

我在Rails 3.2rc1应用程序中有一些资产,以下是其中一些:

app/
  assets/
    stylesheets/
      application.css.scss
      users.css.scss
      projects.css.scss
      (...)
      parts/
        fonts.scss
        (...)

application.css.scss只是一个明显的行,例如:

@import 'parts/fonts';

views/layouts/application.html.slim加载预编译的样式表:

= stylesheet_link_tag "application", media: "all"
= stylesheet_link_tag params[:controller], media: "all"

到目前为止,这么好,对于开发来说效果很好。在生产部署期间,调用rake assets:precompile并且它适用于应用程序样式表。但是跳过了每个控制器的样式表,因此app炸弹。

要解决此问题,我已将其添加到config/environments/production.yml

config.assets.precompile += %w(*.css *.js)

现在编译了每个控制器的样式表,但该应用程序仍在使用以下内容进行轰炸:

ActionView::Template::Error (application.css isn't precompiled):
    5:     = stylesheet_link_tag "application", media: "all"
  app/views/layouts/application.html.slim:5:in `_app_views_layouts_application_html_slim__4032169744877009540_23192340'

但是当我查看public/assets/时,预编译的application-3218a93530ecb65582d5b345133dab49.css和它的压缩双胞胎就在那里。

如果我将config/environments/production.yml中的通配符替换为所有每个控制器样式表的列表(换句话说:除了application.css之外的所有样式表),一切都像魅力一样:

config.assets.precompile += %w(users.css projects.css)

应用程序样式表是否经过两次处理,从而导致预编译无法按照宣传的那样工作?

1 个答案:

答案 0 :(得分:4)

以下是我现在解决这个问题的方法:

files = Dir[Rails.root.join('app', 'assets', '{javascripts,stylesheets}', '**', '[^_]*.{js,css}*')]
files.map! {|file| file.sub(%r(#{Rails.root}/app/assets/(javascripts|stylesheets)/), '') }
files.map! {|file| file.sub(%r(\.(coffee|scss)), '') }
config.assets.precompile += files

在某些时候可能会有更好的解决方案: https://github.com/rails/rails/issues/3094