为什么MSBuild突然说我的<target>在Visual Studio重建期间没有输出?</target>

时间:2015-02-25 16:31:43

标签: msbuild

我有一个目标&#34; B&#34;这取决于目标&#34; A&#34;。目标&#34; A&#34;创建一个项目,目标B具有Inputs作为其输出(使用为目标中的项目创建的自定义元数据进行转换&#34; A&#34;)。

<Target Name="A" Condition="$(Configuration) == 'Debug'">
    <ItemGroup>
        <ConfigTemplates Include="@(ContentWithTargetPath)" Condition="'%(Extension)' == '.template'">
            <Original>%(FullPath)</Original>
            <Destination>$(ProjectDir)$(OutputPath)%(TargetPath)</Destination>
        </ConfigTemplates>
    </ItemGroup>
</Target>

<Target Name="B" 
    AfterTargets="AfterBuild"
    DependsOnTargets="A"
    Condition="$(Configuration) == 'Debug'"
    Inputs="@(ConfigTemplates)"
    Outputs="@(ConfigTemplates->'%(Destination)')">
    ...
</Target>

这很好用,它完全支持增量构建(是一个&#39;源&#39;更改目标&#34; B&#34;被执行,否则被跳过)。

然而,只要我创建一个目标&#34; C&#34;这也取决于目标&#34; A&#34;,突然瞄准&#34; B&#34;总是被跳过,因为它没有输出&#34;。

<Target Name="C"
    AfterTargets="AfterBuild"
    DependsOnTargets="A"
    Condition="$(Configuration) == 'Debug'">
    ...
</Target>

为什么会出现这种情况?

这引出了一个更普遍的问题:这是为多个任务动态提供项目的正确方法吗?

编辑: 我试图通过删除DependsOnTargets并将BeforeTargets="B;C"放在目标&#34; A&#34;上来扭转它。但结果是一样的。

编辑: 重要我发现问题是由Visual Studio执行的重建。显然在重建期间,此特定配置会导致&#34;没有输出&#34;目标&#34; B&#34;。是因为在重建目标期间&#34; C&#34;来到目标&#34; B&#34;之前,以某种方式&#39;无效&#39; ConfigTemplates?

1 个答案:

答案 0 :(得分:1)

提示1:尝试为您的防病毒添加例外。我注意到其中一些(作为我的Avast!)曾经出于某种原因阻止Visual Studio构建。

提示2:如果您正在使用&#34; A&#34;输出&#34; B&#34;和&#34; C&#34;,尝试添加

"BeforeTargets="C"

到&#34; B&#34;,以确保它以正确的顺序构建。根据您的描述,似乎&#34; C&#34;以某种方式执行&#34; B&#34;。

相关问题