1

有没有一种通用的方法可以让我获得一个构建后事件来将构建的程序集以及任何 .config 和任何 .xml 注释文件复制到一个文件夹(通常是解决方案相关),而无需在每个项目上编写一个构建后事件一个办法?

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

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

谢谢,
基龙

4

1 回答 1

3

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

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

第三种变体是添加到您要发布的每个项目的自定义目标的导入。请参阅如何:在多个项目文件中使用相同的目标

于 2011-03-09T15:31:05.543 回答