私はそのようなバンドルを持っています
bundles.Add(new StyleBundle("~/Content/themes/default/css")
.IncludeDirectory("~/Content/themes/Default", "*.css"));
しかし、1つのCSSファイルを除外したいと思います。
バンドル内の各CSSファイルを指定せずにこれを作成することは可能ですか?
私はそのようなバンドルを持っています
bundles.Add(new StyleBundle("~/Content/themes/default/css")
.IncludeDirectory("~/Content/themes/Default", "*.css"));
しかし、1つのCSSファイルを除外したいと思います。
バンドル内の各CSSファイルを指定せずにこれを作成することは可能ですか?
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;
}
そして、使用法は次のとおりです。
bundles.Add(new StyleBundle("~/Content/themes/default/css")
.IncludeDirectoryWithExclusion("~/Content/themes/Default", "*.css", "file-you-dont-want.css"));
現時点では PC を使用していないため、上記はテストされていませんが、ソリューションのテンプレートを提供する必要があります。
Jon Malcolm による良い提案 (および、Satpal によるいくつかの更新はこちら) を改善して、いくつかの欠点を修正しました。
1) 「.min.」を使用すると、バンドルのデフォルトの動作が中断されます。ファイル
2) 検索パターンは許可されませんが、ファイルのみが除外されます
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;
}
}
私が持っている使用例は、angular で始まる lib フォルダーからすべてのライブラリを含めることですが、すべてのロケール スクリプトを除外します (後で別のバンドルの言語に基づいて 1 つだけが追加されるため)。
bundles.Add(new Bundle("~/bundles/scripts")
.Include("~/wwwroot/lib/angular/angular.js") // Has to be first
.IncludeDirectoryWithExclusion("~/wwwroot/lib", "*.js", true, "*.locale.*.js"));
angular.min.js と angular.js の両方があり、デバッグで縮小されていないバージョンを追加し、リリースで既存の .min.js を使用すると、これは適切に動作します。
既存のIncludeDirectory
メソッドをオーバーロードし、サブディレクトリの検索をサポートする別の拡張メソッドを次に示します。
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());
}
}