萨斯混入递归; @include环(Sass mixin recursion; @include

2019-10-17 20:48发布

有谁知道,如果有可能恢复萨斯的功能,防止了“漏洞修复” 1在其实施,以防止@include递归?

该消息是:

Syntax error: An @include loop has been found: <mixin-name> includes itself

这是在“固定” 1 3.0.5 ,我不希望( 阅读:我不能 )降级那么远。 我遗憾的是不知足的Ruby要经过筛选源,而我正在做的时间来改变这种状况,它并不能帮助我。

这样,是有可能2,而不必降级恢复此功能到该预3.0.5的; 有没有重新修补飘绕的地方? 我一直没能找到一个。

编辑:虽然我现在这样回答我,我还是开到更好的答案; 具体而言,更便携的解决方案,因为现在的Sass文件将打破其他地方( 即不预先3.0.5任何地方

用于指示,我不认为这是一个修复行情1。 我认为这是一个突破; 我会采取了责任人虽然。
2 我知道它可能的,但我的意思是专门为某人使用Ruby没有实践经验。 我在学习Ruby!

Answer 1:

好了,有一个更清洁的方式适用于您的黑客: 猴子修补与指南针 。

它可以让你安全地共享您的项目,其他人将能够编译它,而无需修改自己的SASS编译器。

1)

创建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

2)

需要从猴子补丁config.rb

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

3)

编译与您的项目compass compile



Answer 2:

你知道,我知道足够的红宝石注释掉一行或两行)

.\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

突然,光荣递归的彩虹。



文章来源: Sass mixin recursion; @include loop