【问题标题】:Bootstrap 3.1.1 less in ASP.NET MVC 5 have error with EnableOptimizations in trueASP.NET MVC 5 中的 Bootstrap 3.1.1 less 在 EnableOptimizations 为 true 时出现错误
【发布时间】:2014-05-25 00:09:58
【问题描述】:

我在“ASP.NET MVC 5”中有一个项目,并在“bootstrap 3.1.1”中使用“less”,我对文件使用以下库,并最小化这个:

http://www.nuget.org/packages/BundleTransformer.Core/ http://www.nuget.org/packages/BundleTransformer.Less/ http://www.nuget.org/packages/JavaScriptEngineSwitcher.Core/ http://www.nuget.org/packages/JavaScriptEngineSwitcher.Msie/ http://www.nuget.org/packages/MsieJavaScriptEngine/

我在 MVC 4 中有类似的项目,但在 MVC 5 中,当我在 true 中设置 BundleTable.EnableOptimizations 时,如下所示:

public static void RegisterBundles(BundleCollection bundles)
{
    BundleTable.EnableOptimizations = true;

出现以下错误,不会用变量解释文件“less”,例如错误是:

Error type: Name
Message: variable @font-family-base is undefined
File: /Content/bootstrap/scaffolding.less
Line number: 29
Column number: 15
Source error:

Line 28: body {
Line 29:   font-family: @font-family-base;
-----------------------^
Line 30:   font-size: @font-size-base;

但如果我在/Content/bootstrap/scaffolding.less 中包含/导入带有变量的文件:

@import "variables.less";
@import "mixins.less";

错误没有发生,错误继续到下一个文件。

编辑

现在同样的事情发生在我身上,但是使用 ASP.NET MVC 4,这些是我通过 nuget 安装的库。我不明白问题是什么,或者是否发生了兼容问题:

<package id="AjaxMin" version="5.6.5100.19204" targetFramework="net40" />
<package id="AngularJS.Core" version="1.2.16" targetFramework="net40" />
<package id="Antlr" version="3.5.0.2" targetFramework="net40" />
<package id="BundleTransformer.Core" version="1.8.17" targetFramework="net40" />
<package id="BundleTransformer.Less" version="1.8.14" targetFramework="net40" />
<package id="BundleTransformer.MicrosoftAjax" version="1.8.15" targetFramework="net40" />
<package id="FontAwesome" version="4.1.0" targetFramework="net40" />
<package id="JavaScriptEngineSwitcher.Core" version="0.9.5" targetFramework="net40" />
<package id="JavaScriptEngineSwitcher.Msie" version="0.9.5" targetFramework="net40" />
<package id="jQuery" version="1.10.2" targetFramework="net40" />
<package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net40" />
<package id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="1.0.0" targetFramework="net40" />
<package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net40" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net40" />
<package id="Microsoft.AspNet.WebApi" version="4.0.30506.0" targetFramework="net40" />
<package id="Microsoft.AspNet.WebApi.Client" version="4.0.30506.0" targetFramework="net40" />
<package id="Microsoft.AspNet.WebApi.Core" version="4.0.30506.0" targetFramework="net40" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="4.0.30506.0" targetFramework="net40" />
<package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net40" />
<package id="Microsoft.Bcl" version="1.1.9" targetFramework="net40" />
<package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net40" />
<package id="Microsoft.Net.Http" version="2.2.22" targetFramework="net40" />
<package id="Microsoft.Owin" version="2.1.0" targetFramework="net40" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net40" />
<package id="Modernizr" version="2.7.2" targetFramework="net40" />
<package id="MsieJavaScriptEngine" version="1.1.3" targetFramework="net40" />
<package id="Newtonsoft.Json" version="6.0.1" targetFramework="net40" />
<package id="Owin" version="1.0" targetFramework="net40" />
<package id="Twitter.Bootstrap.Less" version="3.1.1" targetFramework="net40" />
<package id="WebActivatorEx" version="2.0" targetFramework="net40" />
<package id="WebGrease" version="1.5.2" targetFramework="net40" />

web.config:

<sectionGroup name="bundleTransformer">
    <section name="core" type="BundleTransformer.Core.Configuration.CoreSettings, BundleTransformer.Core" />
    <section name="less" type="BundleTransformer.Less.Configuration.LessSettings, BundleTransformer.Less" />
  <section name="microsoftAjax" type="BundleTransformer.MicrosoftAjax.Configuration.MicrosoftAjaxSettings, BundleTransformer.MicrosoftAjax" />
</sectionGroup>
<sectionGroup name="jsEngineSwitcher">
    <section name="core" type="JavaScriptEngineSwitcher.Core.Configuration.CoreConfiguration, JavaScriptEngineSwitcher.Core" />
</sectionGroup>

...

<handlers>
  <add name="LessAssetHandler" path="*.less" verb="GET" type="BundleTransformer.Less.HttpHandlers.LessAssetHandler, BundleTransformer.Less" resourceType="File" preCondition="" />


...

<bundleTransformer xmlns="http://tempuri.org/BundleTransformer.Configuration.xsd">
  <core>
    <css defaultMinifier="MicrosoftAjaxCssMinifier">
      <minifiers>
        <add name="NullMinifier" type="BundleTransformer.Core.Minifiers.NullMinifier, BundleTransformer.Core" />
        <add name="MicrosoftAjaxCssMinifier" type="BundleTransformer.MicrosoftAjax.Minifiers.MicrosoftAjaxCssMinifier, BundleTransformer.MicrosoftAjax" />
      </minifiers>
      <translators>
        <add name="NullTranslator" type="BundleTransformer.Core.Translators.NullTranslator, BundleTransformer.Core" enabled="false" />
        <add name="LessTranslator" type="BundleTransformer.Less.Translators.LessTranslator, BundleTransformer.Less" />
      </translators>
    </css>
    <js defaultMinifier="MicrosoftAjaxJsMinifier">
      <minifiers>
        <add name="NullMinifier" type="BundleTransformer.Core.Minifiers.NullMinifier, BundleTransformer.Core" />
        <add name="MicrosoftAjaxJsMinifier" type="BundleTransformer.MicrosoftAjax.Minifiers.MicrosoftAjaxJsMinifier, BundleTransformer.MicrosoftAjax" />
      </minifiers>
      <translators>
        <add name="NullTranslator" type="BundleTransformer.Core.Translators.NullTranslator, BundleTransformer.Core" enabled="false" />
      </translators>
    </js>
  </core>
  <less useNativeMinification="false" ieCompat="true" strictMath="false" strictUnits="false" dumpLineNumbers="None">
    <jsEngine name="MsieJsEngine" />
  </less>
</bundleTransformer>
<jsEngineSwitcher xmlns="http://tempuri.org/JavaScriptEngineSwitcher.Configuration.xsd">
  <core>
    <engines>
      <add name="V8JsEngine" type="JavaScriptEngineSwitcher.V8.V8JsEngine, JavaScriptEngineSwitcher.V8" />
      <add name="MsieJsEngine" type="JavaScriptEngineSwitcher.Msie.MsieJsEngine, JavaScriptEngineSwitcher.Msie" />
    </engines>
  </core>
</jsEngineSwitcher>

编辑 05-24-14

BundleConfig.cs 是 Css 配置的一部分:

CssTransformer cssTransformer = new CssTransformer();
NullOrderer nullOrderer = new NullOrderer();

Bundle cssBundle = new CustomStyleBundle(BundleName.Css);
cssBundle.Include("~/Content/bootstrap/bootstrap.less");
cssBundle.Include("~/Content/font-awesome.css");
cssBundle.Include("~/Content/site.less");
cssBundle.Transforms.Add(cssTransformer);
cssBundle.Orderer = nullOrderer;
bundles.Add(cssBundle);

【问题讨论】:

    标签: asp.net-mvc less asp.net-mvc-5


    【解决方案1】:

    问题是这样的,在BundleConfig.cs下面的配置不能正确解析less文件。也许他们需要添加一些额外的属性,但它不起作用。

    这就是问题所在,如果这个选项去掉了less文件就被正确处理了。

    //CssTransformer cssTransformer = new CssTransformer();
    NullOrderer nullOrderer = new NullOrderer();
    
    Bundle cssBundle = new CustomStyleBundle(BundleName.Css);
    cssBundle.Include("~/Content/bootstrap/bootstrap.less");
    cssBundle.Include("~/Content/font-awesome.css");
    cssBundle.Include("~/Content/site.less");
    //cssBundle.Transforms.Add(cssTransformer);
    cssBundle.Orderer = nullOrderer;
    bundles.Add(cssBundle);
    

    我不知道“转换”的正确设置,但删除它解决了我的问题,并且文件生成正确且最小。

    【讨论】:

    • 我希望我在 8 小时前就看到了这个问题……我尝试了很多东西……最后就是这么简单。无论如何,我很高兴你发布了答案 - 谢谢
    • 这是因为CustomStyleBundle 类已经包含CssTransformerStyleTransformer 类的实例。在您的情况下,来自 CssTransformerStyleTransformer 类的转换应用两次,这会导致错误。所有这些点都在文档的“Examples of usage” 部分进行了描述。
    • @AndreyTaritsyn 感谢您的评论。对我有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2017-08-24
    • 1970-01-01
    • 2021-07-25
    • 2017-02-04
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多