2013-10-14 4 views
2

Я пытаюсь преобразовать web.configs как часть процесса сборки через MSBuild, что хорошо; но работа с несколькими web.configs в одном решении вызывает проблемы.MSBuild - вызов цели несколько раз с различными параметрами

Код, который мы используем в данный момент извлекает web.config конкретную информацию и передает ее на цель преобразования, обе эти операции сгруппированы в мишени DependsOnTargets:

<Target Name="ExtractWebConfigParams_1"> 
    <!-- Get webConfig1 info --> 
</Target> 

<Target Name="TransformWebConfig_1"> 
    <TransformXml Source="%(webConfig1).Web.config" 
       Transform="%(webConfig1).Web.Stage.config" 
       Destination="%(webConfig1).Web.config" 
       StackTrace="$(StackTraceEnabled)" /> 
</Target> 

<Target Name="ExtractWebConfigParams_2"> 
    <!-- Get webConfig2 info --> 
</Target> 

<Target Name="TransformWebConfig_2"> 
    <TransformXml Source="%(webConfig2).Web.config" 
       Transform="%(webConfig2).Web.Stage.config" 
       Destination="(webConfig2).Web.config" 
       StackTrace="$(StackTraceEnabled)" /> 
</Target> 

<Target 
    Name="Transform_1" 
    DependsOnTargets="ExtractWebConfigParams_1;                          
         TransformWebConfig_1;"> 
</Target> 

<Target 
    Name="Transform_2" 
    DependsOnTargets="ExtractWebConfigParams_2;                          
         TransformWebConfig_2;"> 
</Target> 

Наше решение может содержать до 5 различных web.configs, поэтому для каждого из них нужно будет извлечь, преобразовать и настроить DependOnTargets.

Я не вижу способ обойтись с использованием нескольких целевых объектов извлечения, но кто-нибудь знает, есть ли способ вызвать цель преобразования с разными параметрами вместо того, чтобы делать совершенно новую цель каждый раз?

ответ

3

Вы можете написать отдельный файл .msbuild (.proj) как «логику многократного использования».

У меня есть общая логика «zip up», которую я опубликую ниже. Мой пример был о том, чтобы закрепить сайт asp.net, но инкапсулируя правила о том, какие файлы игнорировать (например, .csproj) ....... и также иметь несколько «крючков» для игнорирования некоторых файлов. Как и в каталоге «images», наш был ОГРОМНЫМ, поэтому я не хотел запирать это каждый раз.

Мой пример напрямую не связан с вашими потребностями. Его идея важна. Инкапсулируйте всю свою логику в один файл и передайте ей параметры.

Я включаю файл .proj в файл Main.proj. Затем передайте ему параметры.

ОДНА ПЕЧА. Относительные каталоги НЕ работают в файле sub .proj, если он находится где угодно, кроме того же каталога, что и файл Main.proj.
Ala, вы не можете установить для свойства каталога что-то вроде «. \ Bin \», вам нужно выяснить полный путь ДО того, как вы вызываете файл sub-proj и передаете полное имя папки. Является ли этот пример, "C: \ моя_папка \ mysolution \ myproject1 \ Bin" ... иначе, независимо от е

код поместить в "вне" Main.proj файла:

<Target Name="ZipItUpUsingCommonLogic"> 

    <Message Text=" " /> 
    <Message Text=" About to Call External MSBUILD File " /> 
    <Message Text=" " /> 

    <MSBuild Projects="..\..\CommonLogicMsBuildStuff\WebSiteZippingCommonLogic.proj" Targets="WebSiteZippingAllTargetsWrapper" Properties="WebSiteFolderFullPath=c:\workstuff\mywebsolution;OutputFolderFullPath=c:\workstuff\buildoutputs;WebSiteZipFileNameNonConfig=MyNonConfigFiles$(Configuration).zip;WebSiteZipFileNameConfigFiles=MyWebSiteConfigFiles$(Configuration).zip;RevisionNumber=333;IgnoreFolder1=c:\workstuff\mywebsolution\images" /> 

</Target> 

код для файл с именем «WebSiteZippingCommonLogic.proj»:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="WebSiteZippingAllTargetsWrapper"> 

    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /> 
    <Import Project="$(MSBuildExtensionsPath)\ExtensionPack\MSBuild.ExtensionPack.tasks" /> 
    <!-- There was an issue with the xsl/document(path) function......this help address the issue. --> 

    <Target Name="WebSiteZippingAllTargetsWrapper"> 
     <CallTarget Targets="ShowParameters" /> 
     <CallTarget Targets="ValidateParameters" /> 
     <CallTarget Targets="ZipTheWebSite" /> 
    </Target> 

    <Target Name="ValidateParameters"> 
    <Error Text="The WebSiteFolderFullPath property was not passed in correctly." Condition="'$(WebSiteFolderFullPath)' == ''" /> 
    <Error Text="The OutputFolderFullPath property was not passed in correctly." Condition="'$(OutputFolderFullPath)' == ''" /> 
    <Error Text="The WebSiteZipFileNameNonConfig property was not passed in correctly." Condition="'$(WebSiteZipFileNameNonConfig)' == ''" /> 
    <Error Text="The WebSiteZipFileNameConfigFiles property was not passed in correctly." Condition="'$(WebSiteZipFileNameConfigFiles)' == ''" /> 
    <!--<Error Text="The RevisionNumber property was not passed in correctly." Condition="'$(RevisionNumber)' == ''" />--> 
    </Target> 

    <Target Name="ShowParameters"> 

     <Message Text=" WebSiteFolderFullPath = $(WebSiteFolderFullPath)" /> 
     <Message Text=" OutputFolderFullPath = $(OutputFolderFullPath)" /> 
     <Message Text=" WebSiteZipFileNameNonConfig = $(WebSiteZipFileNameNonConfig)" /> 
     <Message Text=" WebSiteZipFileNameConfigFiles = $(WebSiteZipFileNameConfigFiles)" /> 
     <Message Text=" IgnoreFolder1 = $(IgnoreFolder1)" /> 
     <Message Text=" IgnoreFolder2 = $(IgnoreFolder2)" /> 
     <Message Text=" IgnoreFolder3 = $(IgnoreFolder3)" /> 
     <Message Text=" " /> 
     <Message Text=" " /> 
     </Target> 


    <Target Name="ZipTheWebSite" DependsOnTargets="ValidateParameters"> 

     <ItemGroup> 
      <WebSiteExcludeFiles Include="$(WebSiteFolderFullPath)\**\*.sln" /> 
      <WebSiteExcludeFiles Include="$(WebSiteFolderFullPath)\**\*.vbproj" /> 
      <WebSiteExcludeFiles Include="$(WebSiteFolderFullPath)\**\*.csproj" /> 

      <WebSiteExcludeFiles Include="$(WebSiteFolderFullPath)\**\*.config" /> 


      <WebSiteExcludeFiles Include="$(WebSiteFolderFullPath)\.svn\**\*.*" /> 
      <WebSiteExcludeFiles Include="$(WebSiteFolderFullPath)\obj\**\*.*" /> 

      <WebSiteExcludeFiles Include="$(WebSiteFolderFullPath)\**\.svn\**" /> 
      <WebSiteExcludeFiles Include="$(WebSiteFolderFullPath)**\.svn\**\*.*" /> 

      <WebSiteExcludeFiles Include="$(IgnoreFolder1)\**\*.*" Condition="'$(IgnoreFolder1)' != ''" /> 
      <WebSiteExcludeFiles Include="$(IgnoreFolder2)\**\*.*" Condition="'$(IgnoreFolder2)' != ''" />   
      <WebSiteExcludeFiles Include="$(IgnoreFolder3)\**\*.*" Condition="'$(IgnoreFolder3)' != ''" />    

     </ItemGroup> 

     <ItemGroup> 
      <WebSiteNonConfigIncludeFiles Include="$(WebSiteFolderFullPath)\**\*.*" Exclude="@(WebSiteExcludeFiles)"> 
      </WebSiteNonConfigIncludeFiles> 
     </ItemGroup> 


     <MSBuild.Community.Tasks.Zip Files="@(WebSiteNonConfigIncludeFiles)" ZipFileName="$(OutputFolderFullPath)\$(WebSiteZipFileNameNonConfig)" WorkingDirectory="$(WebSiteFolderFullPath)\" /> 

     <ItemGroup> 
      <WebSiteConfigIncludeFiles Include="$(WebSiteFolderFullPath)\**\*.config"> 
      </WebSiteConfigIncludeFiles> 
     </ItemGroup> 

     <MSBuild.Community.Tasks.Zip Files="@(WebSiteConfigIncludeFiles)" ZipFileName="$(OutputFolderFullPath)\$(WebSiteZipFileNameConfigFiles)" WorkingDirectory="$(WebSiteFolderFullPath)\" /> 

     <Message Text=" " /> 
     <Message Text=" " /> 

    </Target> 


</Project> 

Если вы не хотите, чтобы инкапсулировать правила в отдельный файл, то вы можете искать это:

http://sstjean.blogspot.com/2006/09/how-to-get-msbuild-to-run-complete.html

Тем не менее, я нахожу постоянным «проверка состояния» раздражающим, поэтому я перешел к методу «по файлу», который я описал выше.

Я собираюсь скопировать/вставить его пример здесь, на всякий случай, когда его блог когда-либо опускается. Помните «gotdotnet.com» ??

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Test" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <ItemGroup> 
    <Package Include="CommonWebSetup.ism"> 
     <PackagerType>IS</PackagerType> 
     <SetupProjFolder>CommonWebSetup</SetupProjFolder> 
     <ISProductConfig>Server</ISProductConfig> 
     <ISReleaseConfig>Release</ISReleaseConfig> 
    </Package> 
    <Package Include="CommonClientSetup.vdproj"> 
     <PackagerType>VS</PackagerType> 
     <SetupProjFolder>CommonClientSetup</SetupProjFolder> 
     <ISProductConfig>Client</ISProductConfig> 
     <ISReleaseConfig>Release</ISReleaseConfig> 
    </Package> 
    </ItemGroup> 


<Target Name="Test" Outputs="%(Package.Identity)" > 
    <Message Text="Removing read-only flag for %(Package.Identity)" Importance="High" /> 

    <Message Text="Setting Environment variable for %(Package.Identity)" Importance="High" /> 

    <Message Condition=" '%(Package.PackagerType)' == 'IS' " 
      Text="Running InstallShield for %(Package.Identity)" Importance="High" /> 

    <Message Condition=" '%(Package.PackagerType)' == 'VS' " 
      Text="Running DevEnv.exe for %(Package.Identity)" Importance="High" /> 
</Target> 
+0

Благодарим за подробный ответ, но это не то, что я ищу. У нас есть аналогичная настройка для zip наших файлов сборки, и все это самодостаточно в одном файле .msbuild, и это то, что мне нужно сделать. Все, что я хочу сделать, это вызвать цель несколько раз с разными параметрами, которые, как я думал, попадут в основы любого языка программирования, пока я не встретил MSBuild .... – ShaneC

+0

Мой ответ был добавлен. – granadaCoder

+0

Использование «Идентичность» или запись отдельного файла ... это как ваши варианты ......... насколько я знаю. – granadaCoder

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