将 Rails 资产列入预编译黑名单

Blacklist Rails assets from being precompile

[重新问清楚--这不是重复问题] 我注释掉了所有包含的 scss 文件,并且出于某种原因 Rails 继续包含它们,这导致了错误。然后我意识到错误发生在预编译中。 Rails 正在检查我的所有资产以预编译它们,但这包括所有部分和所有供应商部分。我不能只是重命名它们。我如何将资产列入黑名单,以免被 Regex 预编译?通过这种方式,我可以排除永远不会直接引用的部分和与供应商相关的部分,并且可以正确地预编译它们的父文件而不会出错

问题不在于 SCSS/SASS,而是你没有调用你的 mixins。

简单来说就是你要先引用admin/mixins,这样你导入的文件才有引用可以用:

#app/assets/stylesheets/modules.scss
@import "admin/mixins";
@import "modules/*";

这将调用 modules.scss 文件中的混入,然后您可以根据需要引用它们。

[根据评论评论编辑] 问题是我什至在开发模式下都在预编译我的所有资产,因此 Rails 正在遍历所有资产,包括供应商资产,而不考虑单个文件是否是部分文件。我通过添加以下代码来解决此问题,以排除任何部分的内容,因为它以下划线开头或位于 "blacklist" :

Rails.application.config.assets.precompile << Proc.new { |path|
        blacklist = [
                /nvd3\/src\/intro.js$/,
                /nvd3\/src\/outro.js$/,
                /^.*\.less$/,
                /admin\/modules/,
                /admin\/themes/,
                /admin\/responsive\..*css/
        ]
        full_path = Rails.application.assets.resolve(path)#.to_path
        puts "path: #{path}\nfull_path: #{full_path}" if BLACK_MAGIC[:assets][:debug]

        if (path =~ /(^[^_\/]|\/[^_])[^\/]*$/) and (path !~ Regexp.union(blacklist) )

                puts "including asset: " + full_path if BLACK_MAGIC[:assets][:debug]
                true
        else
                puts "excluding asset: " + full_path if BLACK_MAGIC[:assets][:debug]
                false
        end
}

您可以将您所有的正则表达式添加到黑名单数组中进行排除,然后是两部分 if 条件

if (path =~ /(^[^_\/]|\/[^_])[^\/]*$/) and (path !~ Regexp.union(blacklist) )

将首先消除以下划线开头的项目(这还不是一个完美的正则表达式,使用 rubular),其次将消除与黑名单表达式匹配的任何内容。

最后,请注意 keithgaputis 部分回答了这个问题 here 但没有说明需要正则表达式的黑名单。在 Rails 中,供应商资源和您自己的应用程序资源通常会有部分内容,按文件甚至按文件类型对文件进行排序真的很痛苦;用正则表达式列入黑名单要好得多。