将构建的程序集(包括PDB,.config和XML注释文件)复制到文件夹后构建

时间:2011-03-09 12:47:51

标签: visual-studio-2010 msbuild post-build-event

是否有一种通用的方法我可以获得一个构建后事件来复制构建的程序集,以及任何.config和任何.xml注释文件到文件夹(通常是解决方案相对),而不必编写构建后事件解决方案中的每个项目?

目标是拥有一个包含整个解决方案的最后一次成功构建的文件夹。

在多个解决方案上使用相同的构建解决方案也很好,可能启用/禁用某些项目(因此不要复制单元测试等)。

谢谢,
基隆

1 个答案:

答案 0 :(得分:3)

您可以设置常用 OutputPath 以在一个临时目录中构建Sln中的所有项目,并将所需文件复制到最新的构建文件夹。在复制操作中,您可以设置一个过滤器来复制所有dll而不在其名称中使用“test”。

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

存在更复杂,更灵活的解决方案。您可以使用 CustomAfterMicrosoftCommonTargets 为构建过程设置挂钩。例如,请参阅此post。 示例目标文件可以是这样的:

 <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”。

第三个变体是添加到要发布自定义目标导入的每个项目。见How to: Use the Same Target in Multiple Project Files