第二个执行的CustomBuild项始终记录“所有输出都是最新的”

时间:2019-04-30 18:22:46

标签: msbuild msbuild-task

我一直在尝试使用MSBuild目标向内容项目添加第二个CustomBuild步骤。首先(将GLSL编译为SPIR-V)可以与CustomBuild项目一起使用。但是,我尝试的第二个总是记录“所有输出都是最新的”。我对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任务,然后说:“所有输出均为最新”。

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

<?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>

1 个答案:

答案 0 :(得分:0)

我认为CustomBuild任务中的Sources属性将是指向包含构建步骤的项目的链接。我发现这需要与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>