问题描述
我的一个项目有Exec copy
命令将文件从一个目录复制到另一个目录。我们间歇性地看到一个问题,其中一个过程是锁定文件,而MsBuild试图在同一文件上执行复制命令。因此,我们面临着该文件正在被另一个进程使用的错误。
我们怀疑这是因为两个不同的元素并行执行。除非第一个完成,否则我们不希望第二个执行。我们可以为AfterBuild属性提供两个值,如下所示。
下面是项目:Project1.proj和Project2.proj。我想将Project2中定义的目标用于Project1。 Project1.proj添加了对Projet2.proj的引用
Project1.proj
<Target Name="TestTarget" AfterTargets="Build;TestTargetAnother" > ..... ..... </Target>
Project2.proj
<Target Name="TestTargetAnother" AfterTargets="Build" > ..... ..... </Target>
解决方法
我们怀疑这是由于两个不同的因素 并行执行。除非第一个完成,否则我们不希望 第二个要执行。
首先,将两个文件重命名为Project1.targets
和Project2.targets
。
后缀为proj
的文件不能在其他引用的文件中使用。具有此后缀的文件无法传输属性。
像这样修改Project1.targets
:
<Project>
<PropertyGroup>
<Flag>false</Flag>
</PropertyGroup>
<Target Name="TestTarget" AfterTargets="Build;TestTargetAnother" Condition="'$(Flag)'=='false'">
<Exec Command="xxxxxxxxxxx"/>
<PropertyGroup>
<Flag>true</Flag>
</PropertyGroup>
</Target>
<Import Project="Project2.targets"/>
</Project>
然后,像这样修改Project2.targets
:
<Project>
<Target Name="TestTargetAnother" AfterTargets="Build" Condition="'$(Flag)'=='false'">
<Exec Command="xxxxxxxx"/>
<PropertyGroup>
<Flag>true</Flag>
</PropertyGroup>
</Target>
</Project>
之后,将Project1.targets
引用到您的xxx.csproj
文件中:
<Import Project="Project1.targets" />
因此,它将执行其中一个并取消另一个。