AlexCuseが述べたように、 SquishItだけを使用して上記のことを行う方法はありませんでした。ただし、https://github.com/jetheredge/SquishIt/issues/170で述べたように、動的な少ないコンテンツを追加できる AddString() へのオーバーロードがあります。
例えば、
.AddString("LessString",".less") // .less が拡張子
これは、LessString にインポート (@import) が含まれていない限り、問題なく機能します。そこで、https://github.com/jetheredge/SquishItからソースをダウンロードし、コードの詳細を調べ始めました。コードを調べてみると、AddString() によって読み込まれたコンテンツの CurrentDirectory が IIS のパス ("c:\windows\system32\inetsrv") に設定されていることがわかりました。その結果、インポートがスローされました
FileNotFoundException (見つからない .less で終わるファイルをインポートしています。)
そのため、現在のディレクトリを設定する方法が必要でした(インポートが検索される参照場所)
これが私がしたことです:
STEP1: CurrentDirectory というプロパティを持つように Asset を拡張
internal string CurrentDirectory { get; set; }
STEP2: AddString() オーバーロードに 3 番目のオプション パラメータを追加
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(リリース用)を修正してカレントディレクトリを設定する
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)
上記の要件では、変数.less を文字列ビルダーに読み込み、次に variable-override.less を追加し、最後に bootstrap-without-variables.less を文字列ビルダーに追加します。
これまでのところうまくいきました。次のシナリオをテストしました。
インポートを含む通常の少ないファイル。.Add("~/content/styles.less")
インポートなしのインラインレス、例えば.AddString(LessString, ".less")
インポートを伴う動的な少ないファイル。.AddString("@import content/bootstrap/variables.less';", ".less", AppDomain.CurrentDomain.BaseDirectory)
近日中にプルリクエストしてみます。これが、インポートで動的な LESS コンテンツをサポートしようとしている人々の助けになることを願っています。