就像AlexCuse提到的那樣,我沒有辦法只用SquishIt來做我上面提到的。但是,如https://github.com/jetheredge/SquishIt/issues/170中所述,AddString()有一個重載,可讓您添加動態內容較少的內容。
例如,
.AddString( 「LessString」, 「以下」)// .LESS是所述擴展
這隻要LessString不包含工作完全正常任何進口(@import)。所以,我從https://github.com/jetheredge/SquishIt下載了源代碼並開始潛入代碼。通過代碼,我發現通過AddString()加載的內容將CurrentDirectory設置爲我的IIS(「c:\ windows \ system32 \ inetsrv」)的路徑。作爲(要導入的.LESS是 無法找到結尾的文件)。其結果是,進口扔
FileNotFoundException異常
所以,我需要一種方法來設置當前目錄(從那裏我進口將被搜索的參考位置)
這裏是我做過什麼:
STEP1:擴展到資產有一個叫做currentDirectory所
012屬性
internal string CurrentDirectory { get; set; }
STEP2:增加了第三個可選參數的AddString()超載
public T AddString(string content, string extension, string currentDirectory = null)
{
return AddString(content, extension, true, currentDirectory);
}
STEP3:更新了AddString()到當前目錄添加到資產
T AddString(string content, string extension, bool minify, string currentDirectory = null)
{
if (bundleState.Assets.All(ac => ac.Content != content))
bundleState.Assets.Add(new Asset { Content = content, Extension = extension, Minify = minify, CurrentDirectory = currentDirectory });
return (T)this;
}
STEP4:修改BundleBase上的PreprocessArbitary(For Release)以設置當前目錄
protected string PreprocessArbitrary(Asset asset)
{
if (!asset.IsArbitrary) throw new InvalidOperationException("PreprocessArbitrary can only be called on Arbitrary assets.");
var filename = "dummy." + (asset.Extension ?? defaultExtension);
var preprocessors = FindPreprocessors(filename);
return asset.CurrentDirectory != null ?
directoryWrapper.ExecuteInDirectory(asset.CurrentDirectory,() => MinifyIfNeeded(PreprocessContent(filename, preprocessors, asset.Content), asset.Minify)) :
MinifyIfNeeded(PreprocessContent(filename, preprocessors, asset.Content), asset.Minify);
}
調試,修改RenderDebug設置當前目錄
if (asset.IsArbitrary)
{
var filename = "dummy" + asset.Extension;
var preprocessors = FindPreprocessors(filename);
var processedContent = asset.CurrentDirectory != null ?
directoryWrapper.ExecuteInDirectory(asset.CurrentDirectory,() => PreprocessContent(filename, preprocessors, asset.Content)) :
PreprocessContent(filename, preprocessors, asset.Content);
sb.AppendLine(string.Format(tagFormat, processedContent));
}
這裏是我的我現在怎麼添加動態或靜態減檔:
.AddString("@import 'content/bootstrap/variables.less';", ".less", AppDomain.CurrentDomain.BaseDirectory)
對於我的上述要求,我讀的變量。減少到字符串生成器,然後添加我的變量override.less,並最後將bootstrap-without-variables.less添加到字符串生成器。
到目前爲止它已經爲我工作。我測試了以下情況:
- 正常情況下導入的文件較少,例如
.Add("~/content/styles.less")
- 沒有進口的內聯減少,例如,
.AddString(LessString, ".less")
動態減少導入的文件,例如.AddString("@import content/bootstrap/variables.less';", ".less", AppDomain.CurrentDomain.BaseDirectory)
我會盡快做出拉取請求。我希望這可以幫助那些希望通過導入來支持動態LESS內容的人。
很高興你的工作!期待看到您的拉動請求,這將是一個偉大的事情補充。所以你知道,搞亂Environment.CurrentDirectory可以帶來一些有趣的後果,所以它很好地以某種方式來限制變化。您可能想要使用此類將執行給定目錄中的代碼,然後恢復以防止不穩定:https://github.com/jetheredge/SquishIt/blob/9d45fd53bde37d610d49a6fea31b3150897c5676/SquishIt.Framework/Files/DirectoryWrapper。cs – AlexCuse
我剛剛提交了一個拉取請求,隨着還原的變化。 https://github.com/jetheredge/SquishIt/pull/246 –
非常感謝! – AlexCuse