Скопируйте собранные сборки (включая файлы PDB, .config и XML) в папку после сборки - PullRequest
1 голос
/ 09 марта 2011

Существует ли общий способ получения события после сборки для копирования собранной сборки и любых файлов комментариев .config и .xml в папку (обычно относительное решение) без необходимости записывать событие после сборки каждый проект в решении?

Цель состоит в том, чтобы иметь папку, содержащую последнюю успешную сборку всего решения.

Было бы неплохо использовать одно и то же решение для сборки и для нескольких решений, возможно, включить / отключить определенные проекты (поэтому не копируйте юнит-тесты и т. Д.).

Спасибо,
Кирон

1 Ответ

3 голосов
/ 09 марта 2011

Вы можете установить общий OutputPath для сборки всех проектов в Sln в одном временном каталоге и копирования необходимых файлов в последнюю папку сборки. В действии копирования вы можете установить фильтр для копирования всех dll без "test" в его названии.

msbuild.exe 1.sln /p:Configuration=Release;Platform=AnyCPU;OutputPath=..\latest-temp

Существует более сложное и более гибкое решение. Вы можете настроить перехват для процесса сборки, используя CustomAfterMicrosoftCommonTargets . Посмотрите этот пост например. Пример файла цели может быть таким:

 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <BuildDependsOn>
       $(BuildDependsOn);
       PublishToLatest
     </BuildDependsOn>
   </PropertyGroup>

   <Target Name="PreparePublishingToLatest">
     <PropertyGroup>
       <TargetAssembly>$(TargetPath)</TargetAssembly>
       <TargetAssemblyPdb>$(TargetDir)$(TargetName).pdb</TargetAssemblyPdb>
       <TargetAssemblyXml>$(TargetDir)$(TargetName).xml</TargetAssemblyXml>
       <TargetAssemblyConfig>$(TargetDir)$(TargetName).config</TargetAssemblyConfig>
       <TargetAssemblyManifest>$(TargetDir)$(TargetName).manifest</TargetAssemblyManifest>
       <IsTestAssembly>$(TargetName.ToUpper().Contains("TEST"))</IsTestAssembly>
     </PropertyGroup>
     <ItemGroup>
       <PublishToLatestFiles Include="$(TargetAssembly)" Condition="Exists('$(TargetAssembly)')" />
       <PublishToLatestFiles Include="$(TargetAssemblyPdb)" Condition="Exists('$(TargetAssemblyPdb)')" />
       <PublishToLatestFiles Include="$(TargetAssemblyXml)" Condition="Exists('$(TargetAssemblyXml)')" />
       <PublishToLatestFiles Include="$(TargetAssemblyConfig)" Condition="Exists('$(TargetAssemblyConfig)')" />
       <PublishToLatestFiles Include="$(TargetAssemblyManifest)" Condition="Exists('$(TargetAssemblyManifest)')" />
     </ItemGroup>   
   </Target>

   <Target Name="PublishToLatest" 
           Condition="Exists('$(LatestDir)') AND '$(IsTestAssembly)' == 'False' AND  '@(PublishToLatestFiles)' != ''" 
           DependsOnTargets="PreparePublishingToLatest">

     <Copy SourceFiles="@(PublishToLatestFiles)" DestinationFolder="$(LatestDir)" SkipUnchangedFiles="true" />
   </Target>
 </Project>

В этом файле целей вы можете указать любые действия, которые вы хотите.

Вы можете разместить его здесь "C: \ Program Files \ MSBuild \ v4.0 \ Custom.After.Microsoft.Common.targets" или здесь "C: \ Program Files \ MSBuild \ 4.0 \ Microsoft.Common.targets \". ImportAfter \ PublishToLatest.targets».

И третий вариант - добавить в каждый проект, который вы хотите опубликовать, импорт пользовательских целей. См. Как: использовать одну и ту же цель в нескольких файлах проекта

...