12

.less ファイル名を受け取り、それを処理しLess.Parse(<filename>)、処理された css ファイルを出力する ASP.NET MVC アクション メソッドを作成しました。

これは、.less コードが有効である限り正常に機能しますが、エラーが発生した場合、dotLess は空の文字列を返すだけです。そのため、ファイルの処理中にエラーが発生した場合、アクション メソッドは空の css ファイルを返します。

代わりに、構文エラーの詳細な説明を含むエラー メッセージを出力するにはどうすればよいですか?

4

6 に答える 6

14

dotLess パーサーは例外をトラップし、Logger に出力します。これを実行する dotLess のソースからのスニペットは次のとおりですLessEngine.TransformToCss

public string TransformToCss(string source, string fileName)
{
    try
    {
        Ruleset ruleset = this.Parser.Parse(source, fileName);
        Env env = new Env();
        env.Compress = this.Compress;
        Env env2 = env;
        return ruleset.ToCSS(env2);
    }
    catch (ParserException exception)
    {
        this.Logger.Error(exception.Message);
    }
    return "";
}

Less.Parseオブジェクトを受け取るオーバーロードがあり、DotlessConfiguration使用できるいくつかのプロパティを提供します。

public class DotlessConfiguration
{
    // Properties
    public bool CacheEnabled { get; set; }
    public Type LessSource { get; set; }
    public Type Logger { get; set; }
    public LogLevel LogLevel { get; set; }
    public bool MinifyOutput { get; set; }
    public int Optimization { get; set; }
    public bool Web { get; set; }
}

Loggerプロパティのタイプが であることがわかりTypeます。あなたが提供するどんな型も実装しなければなりませんdotless.Core.Loggers.ILogger:

public interface ILogger
{
    // Methods
    void Debug(string message);
    void Error(string message);
    void Info(string message);
    void Log(LogLevel level, string message);
    void Warn(string message);
}

最初のスニペットで見たように、Error解析中にエラーが発生すると、ロガーのメソッドが呼び出されます。

さて、これらすべての 1 つの厄介な点は、実装する型のインスタンスがどのように正確にインスタンス化されるかということILoggerです。内部的に、dotLess は DLL に組み込まれた IoC コンテナーを使用します。メソッド呼び出しに続いて、最終的に呼び出しActivator.CreateInstanceて ILogger をインスタンス化するようです。

これが少なくともいくらか役立つことを願っています。

于 2011-01-25T23:32:42.300 に答える
5

これは、web.config を使用して非常に簡単に行うことができます。dotless 構成セクションに、次を追加しますlogger="dotless.Core.Loggers.AspResponseLogger"。これにより、空白の css の代わりにドットなしのエラーが出力されます。

例として以下を含めました。(「...」は、web.config 内の既存のものを表します)。以下の私の例では、キャッシュが false に設定されています。これは、デバッグ目的で役立ちます。通常の状況では、おそらく true に設定する必要があります。

<configuration>    
     <configSections>
           ...
          <section name="dotless" type="dotless.Core.configuration.DotlessConfigurationSectionHandler,dotless.Core" />
      </configSections>

      <dotless minifyCss="false" cache="false" 
            logger="dotless.Core.Loggers.AspResponseLogger" />
       ...    
</configuration>    
于 2012-05-17T19:21:24.537 に答える
5

今日、RequestReduceプロジェクトでこれに直面しました。イーサに入るように見える解析エラーがあったため、ブランクレス -> css 変換を取得していました。qes の回答のおかげで、エラーを応答ストリームに書き込むことができる解決策を見つけることができました。ここに私の dotless.Core.Loggers.ILogger があります:

public class LessLogger : ILogger
{
    public void Log(LogLevel level, string message)
    {
    }

    public void Info(string message)
    {
    }

    public void Debug(string message)
    {
    }

    public void Warn(string message)
    {
    }

    public void Error(string message)
    {
        Response.Write(message);
    }

    public HttpResponseBase Response { get; set; }
}

これを EngineFactory に送信される構成に渡します。

            var engine = new EngineFactory(new DotlessConfiguration
                                               {
                                                   CacheEnabled = false,
                                                   Logger = typeof (LessLogger)
                                               }
                ).GetEngine();

単体テストの目的で、エラーを書き込む HttpResponseBase を渡したいと思いました。これは、ロガーへの参照を取得するための厄介なキャストで物事が醜くなっていると感じた場所です。

            ((LessLogger)((LessEngine)((ParameterDecorator)engine).Underlying).Logger).Response = response;

これがお役に立てば幸いです。ロガーへの参照を取得するためのよりエレガントな方法を誰かが知っている場合は、お知らせください。

于 2011-12-09T17:36:36.317 に答える
0

他の人の利益のために、@ tony722 のソリューションは、ページから .less ファイルを参照するだけで機能します。

ただし、Less.Parse直接呼び出すと、このメソッドはエラーを に書き込みますResponse

var lessConfig = new DotlessConfiguration { Logger = typeof(AspResponseLogger) };
string css = Less.Parse(someInput, lessConfig);
于 2013-04-11T02:47:19.850 に答える