我的一个项目有Exec Copy
命令,可以将文件从一个目录复制到另一个目录。我们偶尔会看到一个问题,其中一个进程正在锁定一个文件,而MsBuild正试图对同一个文件执行复制命令。因此,我们面临着另一个进程正在使用该文件的错误。
我们怀疑这是因为两个不同的元素并行执行。除非第一个完成,否则我们不希望第二个执行。我们可以为AfterBuild属性设置两个值吗,如下所示。
以下是项目:Project1.proj和Project2.proj。我想将Project2中定义的目标用于Project1。项目1.proj为项目2.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>
之后,在xxx.csproj
文件中引用Project1.targets
:
<Import Project="Project1.targets" />
因此它将执行其中一个并取消另一个。