Asp.Net Bundle - Как вызвать исключение при сбое минификации

Я использую Asp.Net MVC 5 и систему связывания и минимизации из System.Web.Optimization 1.1.0.0:

        bundles.Add(new ScriptBundle("~/angularLibraries").Include(
            ......
            ));

а затем визуализировать Bundle:

@Scripts.Render("~/angularLibraries")

Время от времени я вручную проверяю состояние своих пакетов, открывая соответствующий URL в браузере, и иногда я нахожу их с ошибками. Пример:

/* Minification failed. Returning unminified contents.
(262,145-152): run-time error JS1019: Can't have 'break' outside of loop: break a
(40,297-304): run-time error JS1019: Can't have 'break' outside of loop: break a
 */

Поскольку механизм объединения возвращает незавершенное содержимое при сбое минимизации, я не знаю об этой ошибке, пока не открою этот пакет вручную в браузере.

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

1 ответ

Решение

Нашел решение. Я создал собственный класс, который наследуется от ScriptBundle и переопределяет метод ApplyTransforms:

public class CustomScriptBundle : ScriptBundle
{
    public CustomScriptBundle(string virtualPath)
        : base(virtualPath)
    {
    }

    public CustomScriptBundle(string virtualPath, string cdnPath)
        : base(virtualPath, cdnPath)
    {
    }

    public override BundleResponse ApplyTransforms(BundleContext context, string bundleContent, IEnumerable<BundleFile> bundleFiles)
    {
        BundleResponse bundleResponse = base.ApplyTransforms(context, bundleContent, bundleFiles);

        if (bundleResponse.Content.StartsWith("/* Minification failed. Returning unminified contents."))
            ExceptionManager.LogMessage("Minification failed for following bundle: " + context.BundleVirtualPath);

        return bundleResponse;
    }
}

Я закончил тем, что регистрировал сообщение (получая уведомление по электронной почте от Elmah) и не выбрасывал исключение, потому что у меня включена минификация по умолчанию только на производстве, и приложение все равно будет работать нормально.

Если вы выбросите исключение, вы увидите это так:

Это решение также применимо для StyleBundle.

Другие вопросы по тегам