Rails 3 - 预编译文件夹中的所有css,sass和scss文件

问题描述:

所以我有一个项目,特定于页面的样式和css。我已经把这些文件放到了他们自己的目录assets/#{type}/page-specific/,我试图编写一个正则表达式规则来通知预编译器与他们做这件事。Rails 3 - 预编译文件夹中的所有css,sass和scss文件

这对于房子的JS方面非常有用,但是CSS证明更加困难。

# page specific style files: 
app/assets/stylesheets/page-specific/something.css.sass 
app/assets/stylesheets/page-specific/default.css 
app/assets/stylesheets/page-specific/home.css.scss 

我在我的config/initializers/assets.rb文件,此正则表达式的工作:

Rails.application.config.assets.precompile << /(page-specific\/[^(css)]+.css)/ 

的问题是,该[^(css)]部分没有做我想做什么比较,因为它会过滤掉任何有交流或者在里面。我真正想要的是一种匹配整个字符串“css”并停在那里的方法。

另外,我知道传统的看法是简单地编写样式,以便不需要特定于页面的样式表而支持包含整个样式表的application.css。我同意。然而,这是一个非常庞大的代码库,将Rails升级带回家需要花费很多时间,并且没有时间花费分析和重构这种性质的东西。

我试过让分隔符指令[^\.]停在第一个点上,但是这在一些供应商的样式表上发生了变化,这些样式表使用点作为分隔符,如jquery.treeview.css.sass。显然,我可以更改文件名,但是我们是一支规模不断扩大的团队,我希望尽可能灵活地制定规则,这样我们就不会有任何文件潜入,当他们没有得到时,这些文件就会被炸毁预编译。

+0

你有 “* = require_tree。”在你的app/assets/stylesheets/application.css中的某处?如果没有,尝试添加它可能会有所帮助。 – rootless

+0

正如所解释的那样,在完整应用程序范围之外的资源需要预编译并单独包含。 – DVG

+0

所有这三个示例文件路径似乎都不在“完整应用程序的范围之外”(如果这意味着“在应用程序的目录树之外”)。实际上,默认情况下,它们应该通过资产预编译来获取,因为它们在应用程序/资产中(如果require_tree存在于application.css中)。我想我错了。 – rootless

这个答案是专门针对正则表达式的。您正在寻找“缺少字符序列css”而不是[^(css)]


此正则表达式采用类似的方法对你的:

/(page-specific\/(?:(?!\.css).)++\.css)/ 

说明:

  • page-specific\/字符序列 “页专用/” 的字面匹配。
  • (?:打开一个非捕获组。
    • (?!\.css)断言当前索引不是字符序列“的CSS”。

如果这个断言在所述第一时间该组匹配失败,则当前部分将不能被匹配(特定页面/的CSS是没有好),否则这终止组量化,因为我们已经匹配.css,并返回到\.css)/完成。

    • .匹配任何除换行符。
  • )++有组织地关闭和量化无限次(无返回)。
    注意:Ruby支持从Ruby 1.9开始的所有格量词。
  • \.css字面上匹配字符序列“.css”。

visualization

了解更多:


如何如果没有过,这正则表达式做它用nongreedy修改:

/(page-specific\/.+?\.css)/ 

由于.+?的匹配,而几次越好,所捕获的数据,保证在第一.css结束。

visualization

了解更多:


PS:你可能已经忘记了逃跑靠近你的正则表达式的.css/末点。


指定者:
http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm

类=“扰流”>
+2

这是门票!谢谢你的理由和解释解决方案 – DVG

+0

你应该得到一个这个反应的福气勋章 –

+0

@TheDembinski你的荣幸是我最好的奖励。 – Unihedron

好吧,我想我现在明白了。假设你有这两个文件:

app/assets/stylesheets/page-specific/default.css 
app/assets/stylesheets/page-specific/more-specific/home.css.scss 

后您添加到您的配置/初始化/ assets.rb

Rails.application.config.assets.paths << Rails.root.join('app', 'assets', 'stylesheets', 'page-specific') 
Rails.application.config.assets.precompile << /.+\.css$/ 

请注意,这甚至应该为工作目录之外“应用程序/资产”(当然,你需要修改添加到config.assets.paths的路径)。

你应该能够引用它们在你的网页ERB像这样:

<%= stylesheet_link_tag 'default', media: 'all' %> 
    <%= stylesheet_link_tag 'more-specific/home', media: 'all' %> 

我希望这有助于。