2010-01-13 2 views
3

Я поднимаюсь на конечных этапах проекта Asp.Net MVC 1.0 в VS2008/Framework 3.5 и стараюсь сделать некоторые оптимизации производительности. В моем проекте у меня есть несколько разных «тем», которые используются, в зависимости от роли зарегистрированного пользователя. Моя структура папок тем же ...Перечисление папок с 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: Компрессор YUI для .Net (что действительно круто), чтобы минимизировать и объединить файлы css (и js).

Я выполнил пример в http://yuicompressor.codeplex.com/wikipage?title=Sample%20MSBuild.xml%20File&ProjectName=yuicompressor, чтобы запустить сценарий MSBuild через событие post-build для выполнения задач minify/merge.

Все прекрасно работает, за исключением того, что когда я использую что-то вроде <CssFiles Include="..\Themes\**\*.css" /> в моем ItemGroup, чтобы указать, где, чтобы получить файлы CSS, все CSS-файлы из каждой темы будут объединены в один файл, как это ...

\Themes 
     \SylesSheetFinal.css 

Что я хочу вместо этого слиться только CSS под тем, создавая один CSS файл для каждого ...

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

Я действительно новым для MSBuild. Кто-нибудь знает, как я могу изменить образец, чтобы автоматически перемещаться по каждой из папок темы и создавать миниатюрные/объединенные таблицы стилей для каждого? Темы могут быть добавлены или удалены довольно часто, поэтому я не хочу, чтобы вручную включать каждый путь к моей статье ItemGroup. Вместо этого я хочу, чтобы скрипт MSBuild автоматически запускал подпапки под корнем Themes независимо от количества папок.

Спасибо!

ответ

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, пожалуйста, прочитайте его. –

Смежные вопросы