2013-04-08 82 views
4

我所有我使用DotLess与我在网上找到的LessTransformer.cs,在我的MVC 4项目。Site.less'是一个物理路径,但预计虚拟路径

using System; 
using System.IO; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Web.Optimization; 
using MyNamespace.Infrastructure.Bundler; 
using dotless.Core.configuration; 

namespace MyNameSpace.Infrastructure.Transformers.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(); 

      _configuration.MinifyOutput   = false; 
      _configuration.ImportAllFilesAsLess = true; 
      _configuration.CacheEnabled   = false; 
      _configuration.LessSource   = typeof(VirtualFileReader); 

      foreach (var file in response.Files) 
      { 
       if (!File.Exists(file.FullName)) 
       { 
        continue; 
       } 

       var content = ResolveImports(file); 

       builder.AppendLine((_configuration.Web) ? 
            dotless.Core.LessWeb.Parse(content, _configuration) 
            : dotless.Core.Less.Parse(content, _configuration)); 
      } 

      response.ContentType = "text/css"; 
      response.Content = builder.ToString(); 
     } 

     private static readonly Regex SLessImportRegex = 
      new Regex("@import [\"|'](.+)[\"|'];", RegexOptions.Compiled); 

     private static string ResolveImports(FileInfo file) 
     { 
      var content = File.ReadAllText(file.FullName, Encoding.UTF8); 

      return SLessImportRegex.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); 
       }); 
     } 
    } 
} 

因为我已经加入到这一

_configuration.MinifyOutput   = false; 
_configuration.ImportAllFilesAsLess = true; 
_configuration.CacheEnabled   = false; 
_configuration.LessSource   = typeof(VirtualFileReader); 



using System.IO; 
using System.Web.Hosting; 
using dotless.Core.Input; 

namespace MyNamespace.Infrastructure.Bundler 
{ 
    internal sealed class VirtualFileReader : IFileReader 
    { 
     public byte[] GetBinaryFileContents(string fileName) 
     { 
      fileName = GetFullPath(fileName); 
      return File.ReadAllBytes(fileName); 
     } 

     public string GetFileContents(string fileName) 
     { 
      fileName = GetFullPath(fileName); 
      return File.ReadAllText(fileName); 
     } 

     public bool DoesFileExist(string fileName) 
     { 
      fileName = GetFullPath(fileName); 
      return File.Exists(fileName); 
     } 

     private static string GetFullPath(string path) 
     { 
      return HostingEnvironment.MapPath("\\Content\\css\\" + path); 
     } 
    } 
} 

我有一个都不能少文件

@import url('LESS\Site.less'); 
@import url('LESS\Site.Main.less'); 

body { 
    #featured-posts { 
     clear:both; 
    } 
} 

@media all and (max-width:320px) { 
    @import url('LESS\Site.Mobile.less'); 
} 

(我已经试过进口和/ w和/ WO函数符号不同的路径url()

这是全部拉入我的BundleConfig

Bundle siteStyles = new  StyleBundle("~/bundles/css").Include("~/Content/css/Main.less"); 
    siteStyles.Transforms.Add(new LessTransform()); 
    siteStyles.Transforms.Add(new CssMinify()); 
    bundles.Add(siteStyles); 

之前我加入了VirtualFileReader我得到的错误: -

C:/SourceControl/Git/MyNameSpace/MyNameSpace/Content/css/LESS/Site.less'是一个物理路径,但预计虚拟路径。

,因为我将我得到它只是值为null上dotless.Core.LessWeb.Parse(内容,_configuration)

它总是炸毁这条线,授予我一直有点枪豪实现这些东西和无点,因为我以前没有用过,但我似乎无法找到任何好的可靠文档/教程。所以,如果你能帮我解决我的错误,那将是非常好的,并且指向我关于这个主题的一些很好的教程的方向,我将非常感激。

[编辑]在少文件和文件结构上添加细节。

My File structure is 

Content/css/Main.less 
Content/css/LESS/Site.less 
Content/css/LESS/Mobile.less 

etc ... TIA。

p.s.不要担心MyNamespace/MyNamespace的问题,我只是简单地将它缩短。

+0

尝试更改'StyleBundle(“〜/ bundles/css”)''StyleBundle(“〜/ Content/css/css”)' – MikeSmithDev 2013-04-08 15:25:12

+0

另外,它似乎更有效地捆绑所有样式而不是使用' @ imports'。 – MikeSmithDev 2013-04-08 15:37:54

+0

它可能更高效,但LESS规范要求'@ imports'。理论上BundleTransform为我们做了“捆绑”。 – mxmissile 2013-04-08 15:42:21

回答

0

我不明白你为什么使用自定义变压器。

较少的规范说,如果你使用下面的语法文件将被自动归类:

@import "LESS/Site"; 

它完美对我来说,我不需要任何定制变压器,只有标准无点包。为了使微小,你需要在web.config此设置:

<dotless minifyCss="true" cache="true" web="true" /> 

我有大约30个进口组件和子组件,输出是一个缩小的文件。

,我建议你不要使用的样式包,而是直接指向你少的文件:

<link href="~/Content/css/main.less" rel="stylesheet" /> 

带点HTTP处理程序将踢,转换少CSS和缓存它后续请求

+0

ahh几星期前我确实解决了这个问题,自从开始一项新工作以来,我只是没有时间回复它。谢谢你的回应。 – JTGrime 2013-05-24 13:47:39

+0

@JTGrime是我的正确答案吗?您是否以不同的方式解决了您的问题? – 2013-05-25 12:51:12

+0

@MarcoBettiolo使用这种方法对浏览器缓存有不利影响吗?意思是,如果你不使用捆绑缓存密钥更新会有问题? – ctc 2013-10-17 16:56:56