Перечисление папок с помощью MSBuild

Я подхожу к завершающей стадии проекта Asp.Net MVC 1.0 в VS2008 / Framework 3.5 и пытаюсь оптимизировать производительность. В моем проекте у меня есть несколько разных «тем», которые используются в зависимости от роли вошедшего в систему пользователя. Структура папок моих тем такая ...

\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! Библиотека пользовательского интерфейса: YUI Compressor для .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 автоматически просматривал подпапки под корнем тем, независимо от количества папок.

Спасибо!


person racingcow    schedule 13.01.2010    source источник


Ответы (1)


То, что вы пытаетесь сделать, можно выполнить с помощью пакетной обработки . Пакетная обработка - это процесс выполнения определенной задачи (или цели) один раз для каждого уникального пакета. Есть два типа дозирования; Пакетирование задач и целевое пакетирование. Пакетирование задач является наиболее распространенным и, как я думаю, вам нужно, исходя из информации, представленной здесь. Пакетирование может сбивать с толку, но это не так уж плохо, если вы вникнете в него.

В пакетной обработке всегда используется оператор %(). Вот пример пакетной обработки задач.

<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.

person Sayed Ibrahim Hashimi    schedule 13.01.2010
comment
Как я уже упоминал в посте, мне нужно перебрать произвольное количество подпапок, не зная, сколько существует. Ваш образец (и afik batching в целом) требует, чтобы я заранее знал список папок. - person racingcow; 14.01.2010
comment
По предоставленной ссылке вы найдете это сообщение в блоге sedodream.com/2006/08/15 /MSBuildBatching.aspx прочтите его. - person Sayed Ibrahim Hashimi; 14.01.2010