2013-07-12 36 views
3

我们在MVC4中为我们的项目使用引导程序。到目前为止,我们在我们的主布局页面中引用了bootstrap.less文件,并且它工作得很好。然而,一个新的需求已经沿着需要我们有我们的每一个部门的网页定制的外观(每个部门都有自己的布局,使用主布局)使用SquishIt在单独的较少文件中引用变量(支持动态LESS内容)?

bootstrap.less具有这样的结构:

@import variables.less //定义

@import别人//像mixins.less全部进口,reset.less等

,因为我们需要注入我们的变量替代,我们创建了另一个所有变量升ESS文件:

引导,而不-variables.less //包含了所有不variables.less从bootstrap.less

这样做的原因分离注入我们的变量替代,使得进口我们可以为我们的页面定制引导样式。

我们正在使用SquishIt将较少的文件捆绑到一个包中。

这里是捆绑:

Bundle.Css() 
    .Add("~/bootstrap/variables.less") 
    .Add("~/variable-override.less") // custom override 
    .Add("~/bootstrap/bootstrap-without-variables.less") 
    .MvcRender("styles_combined_#.js"); 

这并不在所有的工作。如果我在bootstrap-without-variables.less(现在变得类似于bootstrap.less)中删除了variables.less并且引用它,它就可以很好地工作。

我认为这个问题是,每个文件都被独立评估并转换为独立的css,然后再将它们组合在一起。

有没有办法告诉打包商首先将文件打包成一个,然后评估并转换为css或更好的解决方案来解决这个问题?

回答

2

就像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添加到字符串生成器。

到目前为止它已经为我工作。我测试了以下情况:

  1. 正常情况下导入的文件较少,例如.Add("~/content/styles.less")
  2. 没有进口的内联减少,例如, .AddString(LessString, ".less")
  3. 动态减少导入的文件,例如.AddString("@import content/bootstrap/variables.less';", ".less", AppDomain.CurrentDomain.BaseDirectory)

    我会尽快做出拉取请求。我希望这可以帮助那些希望通过导入来支持动态LESS内容的人。

+2

很高兴你的工作!期待看到您的拉动请求,这将是一个伟大的事情补充。所以你知道,搞乱Environment.CurrentDirectory可以带来一些有趣的后果,所以它很好地以某种方式来限制变化。您可能想要使用此类将执行给定目录中的代码,然后恢复以防止不稳定:https://github.com/jetheredge/SquishIt/blob/9d45fd53bde37d610d49a6fea31b3150897c5676/SquishIt.Framework/Files/DirectoryWrapper。cs – AlexCuse

+1

我刚刚提交了一个拉取请求,随着还原的变化。 https://github.com/jetheredge/SquishIt/pull/246 –

+0

非常感谢! – AlexCuse

1

你是对的,SquishIt在合并文件之前做的处理较少。没有办法只用SquishIt来问你的问题,但我想你可以在你自己的路上合并文件(使用.AddString方法将你最终的无内容添加到包中)。其中一种选择可能更适合您的需求,我不确定。

+0

我将.less文件读入字符串,并使用.less扩展名尝试.AddString重载。但是.less文件中的导入现在还没有找到。 –

+0

嗯,这是有道理的。它看起来像你正在使用的变量覆盖文件的静态引用 - 如果这是你的实际使用情况,我认为你可以只使用修改variables.less文件。如果没有,您可能需要提出自己的解决方案(除非其他优化库中的一个支持您需要执行的操作)。 – AlexCuse

相关问题