是否有人知道是否可以恢复Sass的功能,以防止为防止@include
递归而实施的“bug-fix” 1 ?
消息是:
Syntax error: An @include loop has been found: <mixin-name> includes itself
这是3.0.5中的“修复” 1 ,我不希望(读:我不能)降级到目前为止。遗憾的是,我不知道有足够的Ruby来筛选来源,虽然我正在抽出时间来改变它,但现在对我没有帮助。
那么,是否有可能 2 将此功能恢复为3.0.5之前的功能而不必降级;在某个地方有漂浮物吗?我找不到一个。
编辑:虽然我现在自己已经回答了这个问题,但我仍然愿意接受更好的答案;特别是,更便携的解决方案,因为现在Sass文件将破坏其他任何地方(任何不是3.0.5之前的)
<子>
1 引用用于表示我不认为这是一个修复。我认为这是一个休息;我会接受那些负责任的人
2 我知道它可能,但我的意思是专门针对没有Ruby实际经验的人。我正在学习Ruby!
子>
答案 0 :(得分:2)
好的,有一种更清洁的方式来应用你的黑客:monkey-patching和Compass。
它可以让你安全地共享你的项目,其他人都可以编译它而无需修改自己的SASS编译器。
在sass-visit-mixin-monkey-patch.rb
旁边创建compass.rb
并从那里应用你的黑客:
class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
# Runs a mixin.
def visit_mixin(node)
#include_loop = true
#handle_include_loop!(node) if @stack.any? {|e| e[:name] == node.name}
include_loop = false
@stack.push(:filename => node.filename, :line => node.line, :name => node.name)
raise Sass::SyntaxError.new("Undefined mixin '#{node.name}'.") unless mixin = @environment.mixin(node.name)
if node.children.any? && !mixin.has_content
raise Sass::SyntaxError.new(%Q{Mixin "#{node.name}" does not accept a content block.})
end
args = node.args.map {|a| a.perform(@environment)}
keywords = Sass::Util.map_hash(node.keywords) {|k, v| [k, v.perform(@environment)]}
splat = node.splat.perform(@environment) if node.splat
self.class.perform_arguments(mixin, args, keywords, splat) do |env|
env.caller = Sass::Environment.new(@environment)
env.content = node.children if node.has_children
trace_node = Sass::Tree::TraceNode.from_node(node.name, node)
with_environment(env) {trace_node.children = mixin.tree.map {|c| visit(c)}.flatten}
trace_node
end
rescue Sass::SyntaxError => e
unless include_loop
e.modify_backtrace(:mixin => node.name, :line => node.line)
e.add_backtrace(:line => node.line)
end
raise e
ensure
@stack.pop unless include_loop
end
end
需要来自config.rb
的猴子补丁:
# Enabling mixin recursion by applying a monkey patch to SASS compiler
require "./sass-visit-mixin-monkey-patch"
使用compass compile
编译您的项目。
答案 1 :(得分:1)
你知道,我知道Ruby足以评论一两行;)
.\lib\sass\tree\visitors\perform.rb : 249
只需评论:
# Runs a mixin.
def visit_mixin(node)
include_loop = true
handle_include_loop!(node) if @stack.any? {|e| e[:name] == node.name}
include_loop = false
分为:
# Runs a mixin.
def visit_mixin(node)
# include_loop = true
# handle_include_loop!(node) if @stack.any? {|e| e[:name] == node.name}
include_loop = false
突然,光辉的递归彩虹。