Перечисление папок с MSBuild - PullRequest
3 голосов
/ 14 января 2010

Я подхожу к завершающим этапам проекта 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 автоматически перемещал подпапки под корнем тем, независимо от количества папок.

Спасибо!

1 Ответ

3 голосов
/ 14 января 2010

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

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

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

...