2010-01-13 32 views
3

我将在VS2008/Framework 3.5中的Asp.Net MVC 1.0项目的末尾阶段,并尝试做一些性能优化。在我的项目中,我使用了几个不同的“主题”,具体取决于登录用户的角色。我的主题文件夹结构就像这样...使用MSBuild枚举文件夹

\Themes 
    \Theme1 
     \Css 
      \Folder1 
       \CssFile1.css 
       \CssFile2.css 
      \Folder2 
       \CssFile1.css 
       \CssFile2.css 
     \Images 
      <Images go here> 
    \Theme2 
     \Css 
      \Folder1 
       \CssFile1.css 
       \CssFile2.css 
      \Folder2 
       \CssFile1.css 
       \CssFile2.css 
     \Images 
      <Images go here> 

随着新客户的加入,新的主题将被添加到此文件夹结构中。

我正在使用Yahoo! UI Library:YUI Compressor for .Net (这真的很酷)来缩小和合并我的css(和js)文件。

我按照http://yuicompressor.codeplex.com/wikipage?title=Sample%20MSBuild.xml%20File&ProjectName=yuicompressor的示例通过生成后事件运行MSBuild脚本来执行缩小/合并任务。

一切都很正常,只是当我使用类似<CssFiles Include="..\Themes\**\*.css" />在我的ItemGroup指定到哪里可以得到css文件,从每一个主题的所有CSS文件合并成一个文件,这样的...

\Themes 
     \SylesSheetFinal.css 

我想的却是在主题合并只有CSS,创造了每一个CSS文件...

\Themes 
     \Theme1 
      \StyleSheetFinal1.css 
     \Theme2 
      \StyleSheetFinal2.css 

我真的很新的MSBuild。有谁知道我如何修改示例以自动遍历每个主题文件夹,并为每个文件夹创建缩小/合并样式表?主题可以经常添加或删除,所以我不想将每个主题路径手动包含到我的ItemGroup中。相反,我希望MSBuild脚本自动遍历主题根目录下的子文件夹,而不管文件夹的数量。

谢谢!

回答

3

您想要做的事可以用batching完成。批处理是为每个唯一批次执行一次特定任务(或目标)一次的过程。有两种类型的配料;任务批处理和目标批处理。基于此处提供的信息,任务批次处理是最常见的,也是我认为您需要的。批次可能会让人困惑,但一旦掌握了它,它并不算太坏。

配料总是涉及%()操作员。以下是任务批次的示例。

<Project ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- Batching01.proj --> 
    <ItemGroup> 
    <Files Include="src\Src01.cs"/> 
    <Files Include="src\Src02.cs"/> 
    <Files Include="src\Src03.cs"/> 
    <Files Include="src\Src04.cs"/> 
    </ItemGroup> 

    <Target Name="Demo"> 
    <!-- Not batched, i.e. Files is flattened and sent to the Message task --> 
    <Message Text="Files: @(Files)"/> 

    <Message Text="================" Importance="high" /> 

    <Message Text="Filename: %(Files.Filename)" Importance="high" /> 
    </Target> 
</Project> 

输出将是:

Files: src\Src01.cs;src\Src02.cs;src\Src03.cs;src\Src04.cs 
    ================ 
    Filename: Src01 
    Filename: Src02 
    Filename: Src03 
    Filename: Src04 

实在是太艰难的在这个岗位完全描述配料,但我已经把一些真正伟大的资源,可在网上http://sedotech.com/Resources#Batching

+0

正如我在文章中提到的,我需要遍历任意数量的子文件夹而不知道存在多少个子文件夹。您的示例(以及afik批处理)要求我事先知道文件夹列表。 – racingcow

+0

从提供的链接中,您可以找到http://sedodream.com/2006/08/15/MSBuildBatching.aspx这篇博客文章,请阅读它。 –