黑名单Rails资产被预编译[重复]

Posted

技术标签:

【中文标题】黑名单Rails资产被预编译[重复]【英文标题】:Blacklist Rails assets from being precompile [duplicate] 【发布时间】:2016-01-14 10:25:51 【问题描述】:

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

【问题讨论】:

您必须在每个模块 scss 文件中加载 mixins。它很烦人,但 rails 有时不会像它所说的那样加载所有内容。或者尝试在module.scss开头加载importing mixin文件 你需要先包含你的 mixin - 如果 SCSS 不知道它在哪里,那么调用 mixin 是没有意义的 @HarryBomrah 你不需要在每个文件中包含 mixins,只需要 modules.scss @cimmanon 这绝对不是重复,这是一个与 Rails 相关的问题,添加下划线绝对不是答案,例如,供应商部分 - 你不能只重命名所有供应商部分,对于您重命名的每个文件,您必须更改每个引用,以及供应商升级。 @cimmanon 请取消将此标记为重复。 【参考方案1】:

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

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

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

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

【讨论】:

不,我已注释掉以消除问题。然而文件仍然被加载。【参考方案2】:

[根据评论 cmets 编辑] 问题是即使在开发模式下我也在预编译我的所有资产,因此 Rails 正在检查所有资产,包括供应商资产,而不考虑单个文件是否是部分文件。我通过添加以下代码来解决此问题,以排除任何部分内容,因为它以下划线开头或位于“黑名单”I also describe that solution here:

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 中,供应商资产以及您自己的应用程序资产通常会有部分,并且逐个文件甚至逐个文件类型对该文件进行排序真的很痛苦;使用 Regex 将其列入黑名单要好得多。

【讨论】:

以上是关于黑名单Rails资产被预编译[重复]的主要内容,如果未能解决你的问题,请参考以下文章

RAILS 轨道资产:预编译失败

Rails:预编译资产缺少节点模块

预编译资产失败的 Rails

未使用 Rails 测试环境中的预编译资产

Rails 预编译供应商/资产

即使资产没有变化,也会发生 Rails 资产预编译