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

所以我有一个具有页面特定样式和css的项目。 我已将这些文件放入他们自己的目录assets/#{type}/page-specific/并且我正在尝试编写正则表达式规则以通知预编译器对它们执行此操作。

这对于房子的JS方面很有用,但csscertificate更加困难。

 # 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)]部分没有完全符合我的要求,因为它会过滤掉任何包含ac或s的内容。 我真正想要的是一种匹配整个字符串“css”并停在那里的方法。

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

我试过让delimiter指令[^\.]停在第一个点,但是这会在一些使用点作为分隔符的供应商样式表上jquery.treeview.css.sass例如jquery.treeview.css.sass 。 显然我可以只更改文件名,但我们是一个正在发展的大型团队,我希望尽可能灵活地使规则更加灵活,这样我们就没有潜入的文件,如果它们没有获得,它们会在生产中爆炸预编译。

这个答案专门针对正则表达式。 你正在寻找“没有字符序列css ”代替[^(css)]


这个正则表达式采用与您类似的方法:

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

说明:

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

如果此断言在第一次匹配时失败,则当前部分将无法匹配(页面特定/ .css不合适) ,否则这将终止组量化,因为我们已经匹配.css ,并返回到\.css)/完成。

    • . 匹配除换行之外的任何内容。
  • )++关闭群体并且无限制地量化无限次(不回馈)。
    注意:Ruby支持从Ruby 1.9开始的所有格量词。
  • \.css字面匹配字符序列“ .css ”。

visualization

阅读更多:

  • 占有量词
  • Lookahead和Lookbehind Zero-Length Assertions

但是,如果没有,这个正则表达式使用nongreedy修饰符:

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

作为.+? 匹配尽可能少的次数,结果捕获保证在第一个.css结束。

visualization

阅读更多:

  • 贪婪和懒惰的正则表达

PS:你可能已经忘记在.css/中的正则表达式结尾附近逃脱一个点。


具体说明:
http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm

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

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

将其添加到config / initializers / assets.rb后

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

请注意,这应该适用于'app / assets'之外的目录(当然,您需要修改添加到config.assets.paths的路径)。

您应该能够在ERB页面中引用它们,如下所示:

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

我希望这有帮助。