Как использовать общий элемент ItemGroup в задачах пакетирования - PullRequest
1 голос
/ 26 сентября 2011

Я пытаюсь автоматизировать создание аддона Firefox для двух разных платформ с помощью MSbuild: у меня есть набор общих файлов, которые одинаковы для Mac и Windows и имеют специфичные для платформы файлы.

Я хочуПакетная задача создания XPI (который является просто переименованным Zip-файлом) по платформе, но я не могу найти правильный способ добавить независимые от платформы (общие) файлы в качестве входных данных для Zip-задачи.В настоящее время мое решение состоит в том, чтобы дублировать элементы общих файлов в окнах платформы и на платформе Mac, а затем выполнить пакетную задачу Zip по параметру Platform.У меня такое ощущение, что мое решение не оптимально.Возможно, сообщество может предложить лучшее решение.Ниже приведено упрощенное решение, которое я создал с комментариями:

    <?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <ProjectMSBuildToolsPath Condition=" '$(ProjectMSBuildToolsPath)' == '' ">MSBuild</ProjectMSBuildToolsPath>
  </PropertyGroup>
    <!-- Required Import to use MSBuild Community Tasks -->
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

  <!-- Default platform type is shared-->
  <ItemDefinitionGroup>
    <ZipFiles>
      <Platform>Shared</Platform>
    </ZipFiles>
  </ItemDefinitionGroup>

  <ItemGroup>
    <ZipFiles Include="chrome\overlay.js" />     

    <ZipFiles Include="chrome\Win\methodContainer.js">
      <Platform>Win</Platform>
    </ZipFiles>

    <ZipFiles Include="chrome\Mac\dataContainer.js">
      <Platform>Mac</Platform>
    </ZipFiles>       

  </ItemGroup>

  <Target Name="_PrepareItemsForZip" Outputs="$(Platform)">           
    <ItemGroup>
      <!-- Merge Shared and Windows specific files -->
      <ZipFilesToWin Include="@(ZipFiles)" Condition="('%(ZipFiles.Platform)' == 'Shared') Or ('%(ZipFiles.Platform)' == 'Win')" >
        <Platform>Win</Platform>
      </ZipFilesToWin>     
      <!-- Merge Shared and Mac specific files -->
      <ZipFilesToMac Include="@(ZipFiles)" Condition="('%(ZipFiles.Platform)' == 'Shared') Or ('%(ZipFiles.Platform)' == 'Mac')" >
        <Platform>Mac</Platform>
      </ZipFilesToMac>
    </ItemGroup>
        <!-- Merge Mac and Windows files set -->
    <ItemGroup>
      <_ZipFiles Include="@(ZipFilesToWin);@(ZipFilesToMac)" />
    </ItemGroup> 

  </Target>
  <!-- batch zipping files based on input platform -->
  <Target Name="MakeXPI" DependsOnTargets="_PrepareItemsForZip"  Inputs="@(_ZipFiles)" Outputs="%(Platform)" >
    <Message Text="Zipped files: @(_ZipFiles) %(Platform)"   Importance="high"/>
    <Zip Files="@(_ZipFiles)" WorkingDirectory="" ZipFileName="CoolAddon-%(Platform).xpi" ZipLevel="9" />    
  </Target>
</Project>

1 Ответ

0 голосов
/ 27 сентября 2011

Извлеките их в файл, как SharedProperties.properties:

<?xml version="1.0" encoding="utf-8"?>

<Project ToolsVersion="4.0"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
   <ZipFiles>       
      <Platform>Shared</Platform>     
   </ZipFiles>   
<PropertyGroup>
</Project>

А затем просто импортируйте нужные цели / сценарии:

<Project ... >
     <Import Project="SharedProperties.properties" />
...