.proj文件

问题描述

我的一个项目有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.targetsProject2.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" />

因此,它将执行其中一个并取消另一个。