【发布时间】:2013-03-30 17:13:12
【问题描述】:
我在我的 MVC 4 项目中在网上找到了一个带有 LessTransformer.cs 的 DotLess。
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);
}
}
}
我有一个 Less 文件
@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' 是物理路径,但应该是虚拟路径。
自从我添加它后,我得到的只是 dotless.Core.LessWeb.Parse(content, _configuration) 上的值为 null
它总是在这条线上爆炸,因为我之前没有使用过这两种东西,但我似乎无法找到任何好的可靠文档/教程在上面。因此,如果您能帮助我解决我的错误,那将是非常棒的,并为我指明有关该主题的一些好的教程的方向,我将非常感激。
[编辑] 添加有关较少文件和文件结构的详细信息。
My File structure is
Content/css/Main.less
Content/css/LESS/Site.less
Content/css/LESS/Mobile.less
等等... TIA。
附言不用担心 MyNamespace/MyNamespace 的内容,为了清楚起见,我已将其全部缩短。
【问题讨论】:
-
尝试将
StyleBundle("~/bundles/css")更改为StyleBundle("~/Content/css/css") -
另外,捆绑所有样式而不是使用
@imports似乎更有效。 -
它可能更有效,但 LESS 规范要求
@imports。理论上 BundleTransform 为我们做了“捆绑”。 -
不,在 VirtualFileReader.cs 中尝试过,在 LessTransformer.cs 中没有。我收到以下错误{“您正在导入无法找到的以 .less 结尾的文件。”:“LESS\\Site.less”}
-
次要问题,但您不应该在导入语句中使用正斜杠吗?
标签: c# asp.net asp.net-mvc-4 less dotless