1

再帰を防ぐために実装された「バグ修正」 1を防ぐために、Sassの機能を元に戻すことが可能かどうか誰かが知っていますか?@include

メッセージは次のとおりです。

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

これは3.0.5の1で「修正」されており、これまでダウングレードしたくない(読んでください:できません)。残念ながら、ソースをふるいにかけるのに十分なRubyを知りません。それを変更する時間を作っている間は、今は役に立ちません。

したがって、ダウングレードせずにこの機能を3.0.5より前の機能に戻すことは可能ですか。どこかにリパッチが浮かんでいますか?見つかりませんでした。

編集:私は今これに自分で答えましたが、私はまだより良い答えを開いています。具体的には、Sassファイルが他の場所(3.0.5より前ではない場所)で壊れてしまうため、よりポータブルなソリューションになります

1これが修正だとは思わないことを示すために使用される引用符。休憩だと思います。でも責任者と一緒に取り上げます。
2 私はその可能性を知っていますが、特にRubyの実際の経験がない人を意味します。私はRubyを学んでいます!

4

2 に答える 2

2

さて、あなたのハックを適用するよりクリーンな方法があります:コンパスを使ったモンキーパッチ

それはあなたがあなたのプロジェクトを安全に共有することを可能にし、他の誰もが彼ら自身の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

于 2013-04-02T13:11:56.163 に答える
1

あなたが知っている、私は1、2行をコメントアウトするのに十分な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 に答える