【问题标题】:Parse of '@import (less)' statement raises NullReferenceException in ASP .NET MVC 5 project with dotLess'@import (less)' 语句的解析在带有 dotLess 的 ASP .NET MVC 5 项目中引发 NullReferenceException
【发布时间】:2014-10-16 04:58:58
【问题描述】:

短篇小说

带有Web Essentials 的Visual Studio 2013.3,带有dotLess 1.4.1 的ASP .NET MVC 5 项目。尝试在一个简单的 less 文件中使用 @import (less) 语句,它只导入一个简单的 css 文件,导致 NullReferenceException 的提升。 @import 没有 (less) 指令没有按预期解析 - 它只是被复制到未解析的结果文件中。 有没有办法解决这个问题?还是只是dotLess的一个bug?


长篇大论(带有重现步骤)

  1. 在 Visual Studio 2013.3 中创建一个新的 ASP .NET MVC 5 项目
  2. 通过 NuGet 包管理器安装最新版本的 dotless
  3. ~/Content/ 文件夹中创建一个简单的Site.less 文件,它只导入默认的Site.css 文件:

_

@import (less) "Site.css";
  1. 根据Bundling and Minification article of ASP .NET MVC 4 tutorial创建LessTransform类如下:

_

using System.Web.Optimization;

public class LessTransform : IBundleTransform
{
    public void Process(BundleContext context, BundleResponse response)
    {
        response.Content = dotless.Core.Less.Parse(response.Content);
        response.ContentType = "text/css";
    }
}
  1. BundleConfig.cs 文件中BundleConfig 类的RegisterBundles 方法中添加以下行:

_

var lessBundle = new Bundle("~/Content/less").Include("~/Content/Site.less");
lessBundle.Transforms.Add(new LessTransform());
bundles.Add(lessBundle);
  1. _Layout.cshtml 文件中删除(或只是注释掉)行:

_

@Styles.Render("~/Content/css")

并添加以下行:

@Styles.Render("~/Content/less")
  1. 运行项目

结果NullReferenceException被抛出LessTransform类就行了:

response.Content = Less.Parse(response.Content);

有没有办法解决这个问题?还是只是dotLess的一个bug?


知识库

  1. 变化中

_

@import (less) "Site.css";

@import (less) "./Site.css";

没有帮助。

  1. 始终复制到Site.css 的输出目录没有帮助。

  2. @import (less) "Site.css" 更改为 @import "Site.css" 并没有帮助,因为 dotLess 不会像我们预期的那样解析结果行。它只是复制行而不进行任何处理。

  3. Web Essentials 2013 for Update 3 正确表示less 文件的编译版本。尽管如此,问题仍然存在。

【问题讨论】:

    标签: c# .net asp.net-mvc less dotless


    【解决方案1】:

    我认为 DotLess 不支持这种类型的导入 @import (less) "Site.css"; 它是在 Less 的 v.1.4 中引入的,但 Dotless 并不总是最新的。

    只需导入 css 即可,然后捆绑即可解决其余部分。

    @import site.css
    

    【讨论】:

    • 不幸的是也不起作用。解析结果 "@import \"Site.css\";"是 "@import \"Site.css\";",所以它不能按预期工作。
    【解决方案2】:

    您可能想尝试使用Web Essentials 2013。看看它是否可以在保存(和构建)时编译你的 less。

    【讨论】:

    • 是的,我已经安装了 Web Essentials,它正确地代表了 less 文件的编译版本。
    • @Deilan 是否有你不能使用它并且需要使用 dotless 的原因?我们发现它有很多错误,并且在使用 Web Essentials 时没有任何问题。
    • 约翰,谢谢您的回复。不,没有绝对的理由使用 dotLess。我尝试使用它,因为这是我听说过的在 ASP .NET MVC 中处理较少文件的唯一工具。我只想从一些引导模板(使用 Node.js 堆栈编写)中导入几个较少的文件到我的项目中。您能否为我的案例推荐一些模式和实践?
    • @Deilan 您应该能够在保存/构建时只使用 Web Essentials 来编译 LESS。检查工具 -> 选项 -> Web Essentials 下的设置。您可以让它显示/隐藏已编译的窗格(非常好)以及选择何时编译(保存、构建或两者兼而有之)。根据您的设置方式,您可能希望将它创建的 css 包含在您的项目中,以便将其检入源代码控制/正确部署。我们最终只包含 css 文件,因为它们很小,这样如果其他人没有安装 Web Essentials,他们仍然可以让网站在本地工作
    【解决方案3】:

    如果将 DotLess 与 WebGrease 和 System.Web.Optimization 之类的东西结合使用,请在此处查看 LessTransform 代码:​​

    https://github.com/philipproplesch/Web.Optimization/blob/master/src/Web.Optimization.Bundles.Less/LessTransform.cs

    在编译和捆绑时,您需要做一些时髦的事情才能让导入命令正常工作。项目中还有一个LessBundle 定义,但是当我创建端口时,我只是声明了一个标准Bundle 并对其应用了转换。

    摘录于此,截至 2014 年 10 月 15 日:

    using System;
    using System.IO;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Web.Optimization;
    using Web.Optimization.Common;
    using dotless.Core.configuration;
    
    namespace Web.Optimization.Bundles.Less
    {
        public class LessTransform : IBundleTransform
        {
            private readonly DotlessConfiguration _configuration;
    
            public LessTransform(DotlessConfiguration configuration)
            {
                _configuration = configuration;
            }
    
            public LessTransform()
                : this(DotlessConfiguration.GetDefaultWeb())
            { }
    
            public void Process(BundleContext context, BundleResponse response)
            {
                var builder = new StringBuilder();
    
                foreach (var file in response.Files)
                {
                    var path =
                       context.HttpContext.Server.MapPath(
                           file.IncludedVirtualPath);
    
                    var fileInfo = new FileInfo(path);
    
                    if (!fileInfo.Exists)
                    {
                        continue;
                    }
    
                    var content = ResolveImports(fileInfo);
    
                    builder.AppendLine(
                        _configuration.Web
                            ? dotless.Core.LessWeb.Parse(content, _configuration)
                            : dotless.Core.Less.Parse(content, _configuration));
                }
    
                response.ContentType = ContentType.Css;
                response.Content = builder.ToString();
            }
    
            private static readonly Regex s_lessImportRegex =
                new Regex("@import [\"|'](.+)[\"|'];", RegexOptions.Compiled);
    
            private static string ResolveImports(FileInfo file)
            {
                var content = File.ReadAllText(file.FullName, Encoding.UTF8);
    
                return s_lessImportRegex.Replace(
                    content,
                    match =>
                    {
                        var import = match.Groups[1].Value;
    
                        // Is absolute path?
                        Uri uri;
                        if (Uri.TryCreate(import, UriKind.Absolute, out uri))
                        {
                            return match.Value;
                        }
    
                        var path =
                            Path.Combine(
                                file.Directory.FullName,
                                import);
    
                        if (!File.Exists(path))
                        {
                            throw new ApplicationException(
                                string.Concat("Unable to resolve import ", import));
                        }
    
                        return match.Value.Replace(import, path);
                    });
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      相关资源
      最近更新 更多