黑名单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资产被预编译[重复]的主要内容,如果未能解决你的问题,请参考以下文章