Visual Studio仅在本地优化构建速度

时间:2016-03-14 17:24:35

标签: visual-studio build msbuild visual-studio-2015

情景是这样的:

我们需要缩短构建包含多个项目的解决方案的时间。我们有一个限制,我们不能合并项目,因此我们有大约50个项目。此时的构建时间约为3分钟。通过手动将所有项目引用属性 CopyLocal 设置为 False 并将输出目录更改为中心目录来进行快速测试,可将建筑性能提高50%以上。但是,问题在于,当我们在CI上部署或用完测试时,DLL丢失了(我怀疑它是通过使用主项目而不是解决方案的所有项目来构建的。)

我认为我可以拥有2套构建指令。一个在开发时将CopyLocal设置为false并将所有DLL输出到单个目录中,另一个在CI和Azure网站中部署时(保留正常的DLL位置)。

我已经阅读了之前的posthere,通过使用目标文件(不确定输出目录)可以使用MsBuild复制本地。因此,我可以让这个在本地机器上使用目标文件,而不是在部署时使用。

我的问题是如何在开发时使用Visual Studio的Build操作来使用特定目标文件,而不是在使用IDE部署到Azure或CI环境时?

1 个答案:

答案 0 :(得分:1)

您可以使用带有条件的项目组来选择性地覆盖输出目录。或者使用它从Reference项目中删除copy-local标志。同样的技巧适用于ProjectReferences

请参阅:

然后使用许多标志使该组成为条件:

 IsDesktopBuild             Is true for a build that's running outside of a build server
 BuildingInsideVisualStudio Is true for a build that's running inside VS

请参阅:

全部放在一起:

<Target Name="BeforeBuild" Condition="'$(IsDesktopBuild)' != 'true'">
  <ItemGroup>
        <ProjectReferenceNew Include="@(ProjectReference)">
           <Private>False</Private>
        </ProjectReferenceNew>
        <ProjectReference Remove="@(ProjectReference)"/>
        <ProjectReference Include="@(ProjectReferenceNew)"/>
  </ItemGroup>

  <ItemGroup>
        <ReferenceNew Include="@(Reference)">
           <Private>False</Private>
        </ReferenceNew>
        <Reference Remove="@(Reference)"/>
        <Reference Include="@(ReferenceNew)"/>
  </ItemGroup>
</Target>

要提高此转换的性能,您需要指定目标的输入和输出参数:

<Target Name="BeforeBuild" Condition="'$(IsDesktopBuild)' != 'true'"
    Inputs="@(Reference);@(ProjectReference)" 
    Outputs="@(Reference);@(ProjectReference)"
>
    ....
</Target>