【问题标题】:Rails 3 - Precompiling all css, sass and scss files in a folderRails 3 - 预编译文件夹中的所有 css、sass 和 scss 文件
【发布时间】:2014-07-03 14:21:39
【问题描述】:

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

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

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

我尝试让分隔符指令[^\.] 在第一个点处停止,但是这会在一些使用点作为分隔符的供应商样式表(例如jquery.treeview.css.sass)上爆炸。显然我可以更改文件名,但我们是一个正在成长的大团队,我想让规则尽可能灵活,这样我们就不会有文件偷偷溜进来,当他们没有得到时会在生产中爆炸预编译。

【问题讨论】:

  • 你有没有“*= require_tree”。在你的 app/assets/stylesheets/application.css 的某个地方?如果没有,请尝试添加它,可能会有所帮助。
  • 如前所述,需要单独预编译和包含完整应用程序范围之外的资产。
  • 所有三个示例文件路径似乎都不是“在整个应用程序的范围之外”(如果这意味着“在应用程序的目录树之外”)。实际上,默认情况下它们应该被资产预编译拾取,因为它们在 app/assets 中(如果你的 application.css 中存在 require_tree)。我想我搞错了。
  • 资产预编译不会提取任何 js 或 css 文件(或将被处理成 js 或 css 文件的文件),除了那些包含在 application.js 或 application.css 中的文件。我不希望这些文件包含在这些文件中,而是被编译并可供运行&lt;%= javascript_include_tag 'page-specific/thingie" %&gt;

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


【解决方案1】:

此答案专门针对正则表达式。您正在寻找“缺少字符序列css”来代替[^(css)]


此正则表达式与您的方法类似:

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

解释:

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

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

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

了解更多:


但是,如果什么都没有,这个正则表达式会使用非贪婪修饰符:

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

由于.+? 匹配的次数尽可能少,因此可以保证捕获结果在第一个.css 处结束。

了解更多:


PS:您可能忘记在 .css/ 的正则表达式末尾附近转义一个点。


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

【讨论】:

  • 这是票!感谢您提供合理且解释清楚的解决方案。
  • 你应该因为这个回应而获得一枚捏造奖章。
  • @TheDembinski 你的快乐是我最好的回报。
【解决方案2】:

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

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' %>

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 2020-07-08
    • 2020-07-08
    • 2019-01-27
    • 1970-01-01
    • 2019-04-17
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多