情景是这样的:
我们需要缩短构建包含多个项目的解决方案的时间。我们有一个限制,我们不能合并项目,因此我们有大约50个项目。此时的构建时间约为3分钟。通过手动将所有项目引用属性 CopyLocal 设置为 False 并将输出目录更改为中心目录来进行快速测试,可将建筑性能提高50%以上。但是,问题在于,当我们在CI上部署或用完测试时,DLL丢失了(我怀疑它是通过使用主项目而不是解决方案的所有项目来构建的。)
我认为我可以拥有2套构建指令。一个在开发时将CopyLocal设置为false并将所有DLL输出到单个目录中,另一个在CI和Azure网站中部署时(保留正常的DLL位置)。
我已经阅读了之前的post和here,通过使用目标文件(不确定输出目录)可以使用MsBuild复制本地。因此,我可以让这个在本地机器上使用目标文件,而不是在部署时使用。
我的问题是如何在开发时使用Visual Studio的Build操作来使用特定目标文件,而不是在使用IDE部署到Azure或CI环境时?
答案 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>