Игнорирование одного файла в комплекте

Настройте мои пакеты следующим образом:

bundles.UseCdn = true;

var scriptJquery = new ScriptBundle(Bundles.Scripts.Jquery, "//code.jquery.com/jquery-1.9.1.js")
    {
        CdnFallbackExpression = "window.jQuery",
    }
    .Include("~/scripts/jquery-{version}.js"); // {version} not work!

bundles.Add(scriptJquery);

var scriptBundle = new ScriptBundle(Bundles.Scripts.Common)
    {
        Orderer = new FileBundleOrderer(server.MapPath("~/Scripts/bundle.txt"))
    }
    .IncludeDirectory("~/Scripts", "*.js", false);
bundles.Add(scriptBundle); 

В моей папке Scripts есть следующая структура.
Обратите внимание, что jQuery находится на том же уровне, что и другие.

Структура папки JS

_Layout.cshtml

@Scripts.Render(CreditoImobiliarioBB.Web.App_Start.Bundles.Scripts.Jquery)
@Scripts.Render(CreditoImobiliarioBB.Web.App_Start.Bundles.Scripts.Common)

При запуске приложения генерируются следующие сценарии. Обратите внимание, что jQuery появился дважды!

<script src="/scripts/jquery-1.9.1.js"></script>    <!--  <------ -->

<script src="/Scripts/moment.js"></script>
<script src="/Scripts/moment.pt-br.js"></script>
<script src="/Scripts/handlebars.runtime.js"></script>
<script src="/Scripts/knockout-2.2.1.debug.js"></script>
<script src="/Scripts/knockout.mapping-latest.js"></script>
<script src="/Scripts/underscore.js"></script>
<script src="/Scripts/bootstrap.js"></script>
<script src="/Scripts/bootstrap-datepicker.js"></script>
<script src="/Scripts/bootstrap-datepicker.pt-BR.js"></script>
<script src="/Scripts/bootstrap-multiselect.js"></script>
<script src="/Scripts/bootstrap-typeahead.js"></script>
<script src="/Scripts/accounting.js"></script>
<script src="/Scripts/jquery.pnotify.js"></script>
<script src="/Scripts/fileuploader.js"></script>
<script src="/Scripts/jquery.inputmask.js"></script>
<script src="/Scripts/jquery.inputmask.extensions.js"></script>
<script src="/Scripts/jquery.inputmask.numeric.extensions.js"></script>
<script src="/Scripts/jquery.inputmask.date.extensions.js"></script>
<script src="/Scripts/jquery.maskMoney.js"></script>
<script src="/Scripts/jquery.bootpag.js"></script>
<script src="/Scripts/Email.js"></script>
<script src="/Scripts/Endereco.js"></script>
<script src="/Scripts/Telefone.js"></script>
<script src="/Scripts/prototypes.js"></script>
<script src="/Scripts/antiForgetyTokenHelper.js"></script>
<script src="/Scripts/ajaxPost.js"></script>
<script src="/Scripts/ajaxUploader.js"></script>
<script src="/Scripts/jquery-1.9.1.js"></script>   <!--  <------ -->
<script src="/Scripts/jquery.cycle.all.js"></script>
<script src="/Scripts/scripts.js"></script>

Если я попытаюсь игнорировать файл jQuery, он никак не появится!

bundles.IgnoreList.Ignore("jquery-{version}.js", OptimizationMode.Always);

Как игнорировать jQuery только в одном пакете? В случае, если Bundles.Scripts.Common


person ridermansb    schedule 07.05.2013    source источник
comment
Вы можете попробовать ответ Джона Малкольма здесь: stackoverflow.com/questions/13990622/   -  person Steve Temple    schedule 07.05.2013
comment
@SteveTemple Это помогает. Я думал что-то вроде Exclude = "jquery.{version}*.js".   -  person ridermansb    schedule 07.05.2013
comment
Вы можете изменить метод расширения, указанный в приведенном выше URL-адресе.   -  person Adam Tuliper - MSFT    schedule 08.05.2013
comment
Именно то, о чем я думал, Адам, вы должны иметь возможность взять это расширение и настроить его так, чтобы оно делало то, что вам нужно.   -  person Steve Temple    schedule 09.05.2013
comment
+1 за безумную стрелу.   -  person Ian Warburton    schedule 06.03.2014


Ответы (1)


Я расширил ответ @Jon Malcolm, чтобы решить мою проблему.

public static class BundleExtentions
{
    public static Bundle IncludeDirectoryWithExclusion(this ScriptBundle bundle, string directoryVirtualPath, string searchPattern, bool includeSubDirectories, params string[] toExclude)
    {
        var folderPath = HttpContext.Current.Server.MapPath(directoryVirtualPath);
        SearchOption searchOption = includeSubDirectories
                                        ? SearchOption.AllDirectories
                                        : SearchOption.TopDirectoryOnly;

        foreach (var file in from file in Directory.GetFiles(folderPath, searchPattern, searchOption) let fileName = Path.GetFileName(file) where String.IsNullOrEmpty(Array.Find(toExclude, s => fileName != null && s.ToLower() == fileName.ToLower())) select file)
        {
            bundle.Include(directoryVirtualPath + file.Replace(folderPath, string.Empty).Replace("\\", "/"));
        }

        return bundle;
    }
}

Применение

 mybundle.IncludeDirectoryWithExclusion("~/Directory", "*.js", true, "excluejsfile.js");

Надеюсь, это поможет вам.

person Satpal    schedule 11.09.2013
comment
Я еще больше улучшил этот код, добавив шаблоны исключения и правильную обработку .min здесь: stackoverflow.com/a/36080620/1671558 - person Ilya Chernomordik; 18.03.2016