2012-12-21 11 views
23

gelen css dosyası hariç ama ondan bir css dosyasını dışlamak istiyorum. , her css dosyasını paket halinde belirtmeden bunu yapmak mümkün mü?asp.net mvc i böyle demetini <pre><code>bundles.Add(new StyleBundle("~/Content/themes/default/css") .IncludeDirectory("~/Content/themes/Default", "*.css")); </code></pre> <p></p> sahip paket

+1

Neden css dosyasını bu dizinden dışarı taşımıyorsunuz? –

+1

Tabii ki bunu yapabilirim ve bu dosya için başka bir paket belirtebilirim, ancak bir dizinde tüm dosyaların olması daha iyi olurdu ve eğer ihtiyacım yoksa, sadece – xurca

+0

paketinden hariç tutuyorum Çok fazla var mı dosyalar Az sayıda dosya varsa, her css'yi ayrı ayrı kaydedebilirsiniz. –

cevap

34

IgnoreList.Ignore; bundles.IgnoreList.Ignore(...).

public static class BundleExtentions 
{ 
    public static Bundle IncludeDirectoryWithExclusion(this StyleBundle bundle, string directoryVirtualPath, string searchPattern, params string[] toExclude) 
    { 
     var folderPath = HttpContext.Current.Server.MapPath(directoryVirtualPath); 

     foreach (var file in Directory.GetFiles(folderPath, searchPattern)) 
     { 
      if (!String.IsNullOrEmpty(Array.Find(toExclude, s => s.ToLower() == file.ToLower()))) 
      { 
       continue; 
      }  

      bundle.IncludeFile(directoryVirtualPath + "/" + file); 
     } 

     return bundle; 
} 

Ve sonra kullanım olmalıdır:

bundles.Add(new StyleBundle("~/Content/themes/default/css") 
    .IncludeDirectoryWithExclusion("~/Content/themes/Default", "*.css", "file-you-dont-want.css")); 

ben şu anda bir PC de değilim yukarıdaki un- yani

+2

Güzel bir örnek için bkz. : https://stack247.wordpress.com/2014/04/18/asp-net-mvc-4-bundles-ignore-list/ – Kildareflare

+0

Bu yanlış bir cevaptır. Ignore'un nasıl kullanılacağını veya nasıl erişileceğini açıklamıyor. Bu, yalnızca bu zayıf özelliklerin hiçbirini açıklayan küçük bir parçacığa sahip bazı zayıf belgelerin bağlantısıdır. Wordpress sitesi hakkındaki yorum burada en yararlı şeydir. – Liam

13

bir uzantısı yöntemi burada ne gerek olabilir test edildi ancak çözümünüz için bir şablon vermelisiniz.

+0

Arama paternleri eklemek ve buradaki eksiklikleri wrt'den .min'e düzeltmek için bu cevabı genişlettim: http://stackoverflow.com/a/36080620/1671558 –

1

Mevcut IncludeDirectory yöntemlerini aşırı yükleyen ve alt dizinleri arama özelliğini destekleyen başka bir uzantı yöntemi. O ".min ile demetlerinin varsayılan davranışını kırar)

1:

public static class BundleExtensions 
{ 
    public static Bundle IncludeDirectory(
     this Bundle bundle, 
     string directoryVirtualPath, 
     string searchPattern, 
     params string[] filesToExclude) 
    { 
     return IncludeDirectory(bundle, directoryVirtualPath, searchPattern, false, filesToExclude); 
    } 
    public static Bundle IncludeDirectory(
     this Bundle bundle, 
     string directoryVirtualPath, 
     string searchPattern, 
     bool searchSubdirectories, 
     params string[] filesToExclude) 
    { 
     var physicalPath = HttpContext.Current.Server.MapPath(directoryVirtualPath); 
     return bundle.Include(Directory 
      .EnumerateFiles(physicalPath, searchPattern, searchSubdirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly) 
      .Select(physicalFileName => physicalFileName.Replace(physicalPath, directoryVirtualPath).Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)) 
      .Where(virtualFileName => !filesToExclude.Contains(virtualFileName)) 
      .ToArray()); 
    } 
} 
4

Jon Malcolm tarafından iyi öneri geliştirdik (ve Satpal here bazı güncellemeler) o vardı birkaç eksikliklerini düzeltmek için ." Bu arama modellerini izin vermez dosyalar ), ancak sadece dosyaları

using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Web; 
using System.Web.Optimization; 


public static class BundleExtentions 
{ 
    public static Bundle IncludeDirectoryWithExclusion(this Bundle bundle, string directoryVirtualPath, string searchPattern, bool includeSubDirectories, params string[] excludePatterns) 
    { 
     string folderPath = HttpContext.Current.Server.MapPath(directoryVirtualPath); 

     SearchOption searchOption = includeSubDirectories 
             ? SearchOption.AllDirectories 
             : SearchOption.TopDirectoryOnly; 

     HashSet<string> excludedFiles = GetFilesToExclude(folderPath, searchOption, excludePatterns); 
     IEnumerable<string> resultFiles = Directory.GetFiles(folderPath, searchPattern, searchOption) 
                .Where(file => !excludedFiles.Contains(file) && !file.Contains(".min.")); 

     foreach (string resultFile in resultFiles) 
     { 
      bundle.Include(directoryVirtualPath + resultFile.Replace(folderPath, "") 
        .Replace("\\", "/")); 
     } 

     return bundle; 
    } 

    private static HashSet<string> GetFilesToExclude(string path, SearchOption searchOptions, params string[] excludePatterns) 
    { 
     var result = new HashSet<string>(); 

     foreach (string pattern in excludePatterns) 
     { 
      result.UnionWith(Directory.GetFiles(path, pattern, searchOptions)); 
     } 

     return result; 
    } 
} 

Ben açısal ile başlayan lib klasördeki tüm kütüphaneleri dahil etmektir sahip bir örnek kullanımı hariç, ancak tüm hariç olmak

Eğer angular.min.js ve angularjs hem varsa
bundles.Add(new Bundle("~/bundles/scripts") 
       .Include("~/wwwroot/lib/angular/angular.js") // Has to be first 
       .IncludeDirectoryWithExclusion("~/wwwroot/lib", "*.js", true, "*.locale.*.js")); 

Bu düzgün davranır ve unminified versiyonunu ekleyin: yerel komut (tek eklenecektir çünkü daha sonra ayrı bir paket içinde dile dayalı) r'deki mevcut .min.js'yi kullanarak hata ayıklama ve kullanma eLease.

+0

Teşekkür ederiz! Bu cevap aynı zamanda paketlemeyle ilgili bir sorunu da çözdü. –

İlgili konular