就像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