Site.less'- это физический путь, но ожидался виртуальный путь
Я все использую DotLess с LessTransformer.cs, который я нашел в Интернете, в своем проекте MVC 4.
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'- это физический путь, но ожидался виртуальный путь.
так как я добавляю его, я получаю просто значение null на dotless.Core.LessWeb.Parse(content, _configuration)
это всегда взрывается в этой строке, при условии, что я был немного напыщенным, реализуя это меньше вещей и без точек, потому что я не использовал ни того, ни другого раньше, но я не могу найти какие-либо хорошие твердые документы / учебники по этому вопросу. Так что, если бы вы могли помочь мне с моей ошибкой, это было бы замечательно и указало бы мне на несколько хороших уроков по этому вопросу, я был бы очень благодарен.
[РЕДАКТИРОВАТЬ] добавление деталей на меньшее количество файлов и файловой структуры.
My File structure is
Content/css/Main.less
Content/css/LESS/Site.less
Content/css/LESS/Mobile.less
и т.д... TIA.
ps не беспокойтесь о вещах MyNamespace/MyNamespace, я только что сократил их для ясности.
1 ответ
Я не понимаю, почему вы используете специальный трансформатор.
Согласно спецификации LESS, если вы используете следующий синтаксис, файл будет автоматически упакован:
@import "LESS/Site";
Он отлично работает для меня, мне не нужны никакие специальные преобразователи, только стандартная упаковка без точек. Чтобы включить минификацию, вам нужен этот параметр в файле web.config:
<dotless minifyCss="true" cache="true" web="true" />
У меня есть около 30 импортов компонентов и субкомпонентов, и на выходе получается один минимизированный файл.
Я предлагаю вам не использовать пакет стилей, а указать непосредственно на ваш файл меньшего размера:
<link href="~/Content/css/main.less" rel="stylesheet" />
Обработчик http без точек запустится, преобразует меньшее в css и кэширует его для последующих запросов