【问题标题】:Copy built assemblies (including PDB, .config and XML comment files) to folder post build将构建的程序集(包括 PDB、.config 和 XML 注释文件)复制到构建后的文件夹
【发布时间】:2011-07-11 21:18:04
【问题描述】:

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

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

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

谢谢,
基隆

【问题讨论】:

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


    【解决方案1】:

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

    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

    【讨论】:

    • 这主意不错,我试试看。谢谢!
    • 是的,我同意,设置 OutputPath 是推荐的方法。
    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 2023-01-19
    • 2012-09-16
    • 1970-01-01
    • 2011-01-01
    • 2021-12-31
    • 2017-03-15
    相关资源
    最近更新 更多