1

有谁知道是否可以恢复 Sass 的功能,以防止为防止递归而实施的“错误修复” 1 ?@include

消息是:

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 实践经验的人。我正在学习红宝石!

4

2 回答 2

2

好的,有一种更简洁的方式来应用您的技巧:使用Compass进行猴子修补

它将让您安全地共享您的项目,并且其他人将能够在不修改自己的 SASS 编译器的情况下编译它。

1)

sass-visit-mixin-monkey-patch.rb在旁边创建compass.rb并从那里应用您的 hack:

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

2)

需要来自以下位置的猴子补丁config.rb

# Enabling mixin recursion by applying a monkey patch to SASS compiler
require "./sass-visit-mixin-monkey-patch"

3)

编译你的项目compass compile

于 2013-04-02T13:11:56.163 回答
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

刹那间,彩虹般的光辉重现。

于 2013-03-20T18:07:06.170 回答