使用MSBuild枚举文件夹

时间:2010-01-13 21:41:26

标签: asp.net-mvc msbuild merge minify

我将参加VS2008 / Framework 3.5中Asp.Net MVC 1.0项目的最后阶段,并尝试进行一些性能优化。在我的项目中,我使用了一些不同的“主题”,具体取决于登录用户的角色。我的主题文件夹结构就是这样......

\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库:.Net的YUI压缩器  (这真的很酷)缩小和合并我的css(和js)文件。

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

一切都很好,除了当我在我的ItemGroup中使用类似<CssFiles Include="..\Themes\**\*.css" />的东西来指定获取css文件的位置时,每个主题的所有css文件都合并到一个文件中,就像这样...

\Themes
        \SylesSheetFinal.css

我想要的只是在主题下合并css,为每个创建一个css文件......

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

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

谢谢!

1 个答案:

答案 0 :(得分: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在线提供了一些非常好的资源。