ASP.Net MVC4 для меньшего количества файлов, которые не отображаются при отладке в false

В простом тестовом приложении ASP.Net MVC4 я установил бесчисленный пакет NuGet и выполнил это руководство.

Мои файлы .less правильно разбираются в CSS и отлично работают при debug=true.

<link href="/Public/less/main.less" rel="stylesheet"/>
<link href="/Public/less/home.less" rel="stylesheet"/>
<link href="/Public/less/a.less" rel="stylesheet"/>
<link href="/Public/less/b.less" rel="stylesheet"/>
<link href="/Public/less/c.less" rel="stylesheet"/>

Однако, когда я устанавливаю debug=false, чтобы его минимизировать и объединить в одну таблицу стилей, я получаю следующее:

<link href="/Public/less?v=" rel="stylesheet"/> // NOT WORKING!

Вот мой конфигурационный файл связки; снова, взятый непосредственно из учебника:

public class BundleConfig
{
    // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkId=254725
    public static void RegisterBundles(BundleCollection bundles)
    {

        // Compile .less files and create a bundle for them.
        var lessBundle = new Bundle("~/Public/less").Include(
                                                        "~/Public/less/main.less",
                                                        "~/Public/less/home.less",
                                                        "~/Public/less/a.less",
                                                        "~/Public/less/b.less",
                                                        "~/Public/less/c.less");
        lessBundle.Transforms.Add(new LessTransform());
        lessBundle.Transforms.Add(new CssMinify());
        bundles.Add(lessBundle);
    }
}

И в моем файле Layout:

<head>
    @Styles.Render("~/Public/less")
</head>

И вот мой класс LessTransform:

public class LessTransform : IBundleTransform
{
    public void Process(BundleContext context, BundleResponse response)
    {
        response.Content = dotless.Core.Less.Parse(response.Content);
        response.ContentType = "text/css";
    }
}

Любые идеи о том, почему пакет не работает должным образом на debug=false?

Ответ 1

Проблема заключалась в молчаливой ошибке при компиляции .less в css.


Я использовал контрольную точку для проверки класса LessTransform, который использует библиотеку dotless для компиляции.

public class LessTransform : IBundleTransform
{
    public void Process(BundleContext context, BundleResponse response)
    {
        response.Content = Less.Parse(response.Content); // Breakpoint here.
        response.ContentType = "text/css";
    }
}

Я заметил, что при наведении курсора на response.Content я мог видеть мой код less, но после кода Less.Parse response.Content станет пустым.

Я проверил свой less код с помощью проверки и заметил синтаксическую ошибку в моем коде.

Как только я исправил свою ошибку, объединение и минимизация работали должным образом, как ожидалось.

Ответ 2

Связывание и минимизация в MVC 4.0 по умолчанию отключается в режиме отладки, поскольку минимизация и связывание делают отладку очень сложной или даже иногда невозможной. Вы можете проверить его, установив точку останова на метод LessTransform.Process. LessTransform.Process запускается только при запуске проекта с debug = false или BundleTable.EnableOptimizations = true.

<link href="/Public/less?v=" rel="stylesheet"/> означает, что результат пучка пуст.

Пожалуйста, убедитесь, что хотя бы один из меньших файлов создает содержимое CSS, если это так, проверьте класс LessTransform, который он должен:

public class LessTransform : IBundleTransform
{
    void IBundleTransform.Process(BundleContext context, BundleResponse response)
    {
        response.Content = Less.Parse(response.Content);
        response.ContentType = "text/css";
    }
}

Поместив BundleTable.EnableOptimizations = true; в метод RegisterBundles, вы можете переопределить настройку по умолчанию механизма оптимизации (Объединение и минимизацию) в режиме отладки, тогда вы можете отлаживать и проверять результат Less.Parse(response.Content);

Ответ 3

Если я не понимаю, что вы сказали, это не имеет смысла.

Если у вас есть debug = true, вы увидите, что ваши таблицы стилей не привязаны, поскольку они ссылаются индивидуально, поэтому не будут проиндексированы/объединены в один файл, это ожидается, когда для отладки установлено значение true, чтобы вы могли легко отлаживайте свои скрипты/стили без необходимости прокручивать через мини-код и связанный код.

Когда у вас есть debug = false, похоже, что минимизация/связывание происходит, поскольку вы получаете только два URL-адреса.

Одна вещь, которая выглядит странно, заключается в том, что у меньшего URL-адреса нет хеша, связанного с ним, т.е. v = пустое, это может быть что-то, что нужно изучить.

Вы также можете попробовать загрузить URL-адрес <localaddress>/Public/less?v= в своем браузере и посмотреть, что он вернет, если у него проблемы с его минимизацией/связыванием, как правило, выдается предупреждение в верхней части файла.

Ответ 4

Похоже, у вас осталось меньше файлов. Так что нормальный хэш не генерируется.

Просто, чтобы вы знали. Вам не нужно использовать пакет для меньшего количества файлов. Вы можете использовать ключевое слово import insinde less для объединения файлов. @import "a.less";