第二次执行 CustomBuild 项目总是记录 "All outputs are up-to-date"

Second executing CustomBuild item always logs "All outputs are up-to-date"

我一直在尝试使用 MSBuild 目标向内容项目添加第二个 CustomBuild 步骤。这首先(将 GLSL 编译为 SPIR-V)与 CustomBuild 项目配合良好。然而,我尝试的第二个,总是记录 "All outputs are up-to-date"。我对 MSBuild 很陌生,所以我确定我在做一些愚蠢的事情。也欢迎对我的脚本进行任何一般性输入:)

我尝试使用几乎相同的命令将第二个 CustomBuild 项目转换为 Exec 项目,但效果很好。据我所知,这不会让我访问跟踪器功能。我也尝试过使用不同的 TrackerLogDirectory 但这似乎没有效果。 我还检查了输入文件,它们正在正确传递。

这是第一个(工作)目标文件:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <PropertyPageSchema Include="$(MSBuildThisFileDirectory)spv.xml" />
    <AvailableItemName Include="SPIRVShader">
      <Targets>CompileGlslShaders</Targets>
    </AvailableItemName>
  </ItemGroup>

  <Target Name="CompileGlslShaders" Condition="'@(SPIRVShader)' != ''" BeforeTargets="FinalizeBuildStatus">
    <MakeDir Directories="$(OutDir)Shaders;$(IntDir)$(ProjectName).tlog"/>

    <ItemGroup>
      <SPIRVShader>
        <Outputs>$(OutDir)Shaders\%(Filename)%(Extension).spv</Outputs>
        <Command>glslangValidator -V -o "$(OutDir)Shaders\%(Filename)%(Extension).spv" "%(FullPath)"</Command>
      </SPIRVShader>
    </ItemGroup>

    <CustomBuild 
      Sources="@(SPIRVShader)" 
      MinimalRebuildFromTracking="True"
      TrackerLogDirectory="$(IntDir)$(ProjectName).tlog\"
      ErrorListRegex="(?'CATEGORY'ERROR|WARNING): (?'FILENAME'.+):(?'LINE'\d+): (?'TEXT'.*)"/>
  </Target>
</Project>

这是第二个:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <PropertyPageSchema Include="$(MSBuildThisFileDirectory)pum.xml" />
    <AvailableItemName Include="PuModel">
      <Targets>CompilePlutoniumModels</Targets>
    </AvailableItemName>
  </ItemGroup>

  <Target Name="CompilePlutoniumModels" Condition="'@(PuModel)' != ''" BeforeTargets="FinalizeBuildStatus">
    <MakeDir Directories="$(OutDir)Models;$(IntDir)$(ProjectName).tlog"/>

    <ItemGroup>
      <CompileModels>
        <Outputs>$(OutDir)Models\%(Filename).pum</Outputs>
        <Command>"$(SolutionDir)..\..\bin_$(PlatformTarget)_$(Configuration)_ContentCompiler\ContentCompiler" -o "$(OutDir)Models\%(Filename).pum" "%(FullPath)"</Command>
      </CompileModels>
    </ItemGroup>

    <CustomBuild
      Sources="@(CompileModels)"
      MinimalRebuildFromTracking="True"
      TrackerLogDirectory="$(IntDir)$(ProjectName).tlog\"
      ErrorListRegex="(?'CATEGORY'ERROR|WARNING): (?'FILENAME'.+):(?'LINE'\d+): (?'TEXT'.*)"/>
  </Target>
</Project>

我希望 CustomBuild 的工作方式与第一个相同,并生成新的 tlog 文件以供检查。目前它只是执行 MakeDir 任务然后说:"All outputs are up-to-date".

编辑: 经过更多测试后,我发现如果我禁用第一个,第二个 CustomBuild 任务甚至不想 运行。在这两种情况下仍会调用目标("CompilePlutoniumModels called!" 正在记录)。但即使是简单的回显也不想自己登录:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <PropertyPageSchema Include="$(MSBuildThisFileDirectory)pum.xml" />
    <AvailableItemName Include="PuModel">
      <Targets>CompilePlutoniumModels</Targets>
    </AvailableItemName>
  </ItemGroup>

  <Target Name="CompilePlutoniumModels" Condition="'@(PuModel)' != ''" BeforeTargets="FinalizeBuildStatus">
    <MakeDir Directories="$(OutDir)Models;$(IntDir)$(ProjectName)_$(MSBuildThisFileName).tlog"/>
    <Message Importance="high" Text="CompilePlutoniumModels called!"/>

    <ItemGroup>
      <CompileModels>
        <Command>echo CompileModels called!</Command>
      </CompileModels>
    </ItemGroup>

    <CustomBuild
      Sources="@(CompileModels)"
      MinimalRebuildFromTracking="True"
      TrackerLogDirectory="$(IntDir)$(ProjectName)_$(MSBuildThisFileName).tlog\"/>
  </Target>
</Project>

我认为 CustomBuild 任务中的 Sources 属性 将是包含构建步骤的项目的 link。我发现这需要与 ItemType 或 ContentType 具有相同的名称。所以我将第二个目标文件更改为:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <PropertyPageSchema Include="$(MSBuildThisFileDirectory)pum.xml" />
    <AvailableItemName Include="PuModel">
      <Targets>CompilePlutoniumModels</Targets>
    </AvailableItemName>
  </ItemGroup>

  <Target Name="CompilePlutoniumModels" Condition="'@(PuModel)' != ''" BeforeTargets="FinalizeBuildStatus">
    <MakeDir Directories="$(OutDir)Models;$(IntDir)$(ProjectName)_$(MSBuildThisFileName).tlog"/>

    <ItemGroup>
      <PuModel>
        <Outputs>$(OutDir)Models\%(Filename).pum</Outputs>
        <Command>call "$(SolutionDir)..\..\bin_$(PlatformTarget)_$(Configuration)_ContentCompiler\ContentCompiler" -o "$(OutDir)Models\%(Filename).pum" "%(FullPath)"</Command>
      </PuModel>
    </ItemGroup>

    <CustomBuild
      Sources="@(PuModel)"
      MinimalRebuildFromTracking="True"
      TrackerLogDirectory="$(IntDir)$(ProjectName)_$(MSBuildThisFileName).tlog\"/>
  </Target>
</Project>