Как правильно использовать IItemTransform для исправления путей в CSS-связке с помощью ASP.NET Web Optimization и BundleTransformer?

В настоящее время я работаю над проектом, который использует библиотеку ASP.NET Web Optimization (v 1.1.0-Beta1) в сочетании с расширением Bundle Transformer (v 1.7.3-Beta1 для ядра, 1.7.0-Beta1 для LESS) который используется для преобразования LESS в CSS. Основываясь на поиске в Интернете, пути в CSS (и меньше) кажутся распространенной проблемой, в большинстве случаев рекомендуется вручную изменить CSS и покончить с этим. Однако из-за различий между нашей средой разработки и производственной средой, а также из-за отсутствия уязвимого CSS такое решение неосуществимо.

Два решения, кажется, существуют. Первый заключается в наложении виртуального каталога, как определено связыванием, на фактический каталог, содержащий содержимое. Мне это кажется плохим вариантом.

Во-вторых, и маршрут, который я выбрал, это использовать IItemTransform такие как CssRewriteUrlTransform (упомянуто в этом сообщении. Даже у этого решения есть свои ограничения. Поэтому я попытался написать свой ItemTransformer но кажется, что результаты его выполнения игнорируются при использовании следующим образом:

public static void RegisterBundles(BundleCollection bundles)
{
    /* among other work pass in IItemTransformer to fix paths */
    var styleBundle = new StyleBundle("~/bundles/css/styles")
        .Include(...)
        .Include("~/Content/less/font-awesome.less", new RewriteUrlTransform())
        .Include(...);

    styleBundle.Transforms.Add(new CssTransformer());
    styleBundle.Orderer = new NullOrderer();

    bundles.Add(styleBundle);
}

Реализация IItemTransform:

public class RewriteUrlTransform : IItemTransform
{
    public string Process(string includedVirtualPath, string input)
    {
        return (input manipulated with proper path replacing bad path)
    }
}

Если я не совсем неправильно понимаю, как IItemTransform должен быть использован, что вполне возможно из-за отсутствия документации, я думаю, что возвращение метода Process - это новый постобработанный CSS. Однако возвращение, похоже, игнорируется. Исходный ввод всегда используется, даже когда я возвращаю String.Empty(), Я что-то здесь не так делаю или это действительно ошибка?

2 ответа

Нет, вы понимаете это правильно, преобразования элемента применяются к элементу, прежде чем они будут объединены вместе, и затем выполняются преобразования пакета. Вы убедились, что он вызывает ваше преобразование, когда вы ожидаете в отладчике?

Bundle Transformer изначально поддерживает автоматическое преобразование относительных путей в абсолютные в CSS-коде. Я говорю вам, как разработчик этого продукта.