对生成的文件进行 MSbuild 最新检查无法根据需要工作

MSbuild up-to-date check for generated files does not work as needed

提问人:Daniel S 提问时间:9/2/2023 更新时间:9/17/2023 访问量:52

问:

我有一个 c# 项目,其中包括几个生成的文件(由 T4 生成),这些文件稍后包含在编译中。代码文件的生成本身工作正常,但不幸的是,增量构建将生成的文件视为“自上次构建以来的更改”,并且每次都会重新生成项目。(对我来说,这是一个问题,因为每次都会重建很大一部分解决方案)。

来自 MSbuild 的警告如下所示

成功生成后,项目未显示为最新:自上次成功生成开始以来,输入编译项“...\DtoGenerator.generated.cs”已被修改,而不是最新的。请参见 https://aka.ms/incremental-build-failure

*csproj 的相关部分:

  <ItemGroup>
          <UpToDateCheckInput Remove="*.generated.cs" />
          <UpToDateCheckOutput Remove="*.generated.cs" />
          <UpToDateCheckBuilt Remove="*.generated.cs" />
  </ItemGroup>
    <Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild">
        <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 &quot;%(TextTemplate.FullPath)&quot; -P=&quot;$(ProjectDir)..\TextTemplating&quot; -I=&quot;$(ProjectDir)..\TextTemplating&quot;" />
    </Target>

我按照警告中建议的链接添加了“UpToDateCheck*”,但它似乎不起作用。

我还看到了另一个使用“<编译删除”的建议解决方案,它似乎确实有助于进行最新检查,但这样生成的文件就不包含在编译中。

有人遇到过类似的问题吗?如何更改 *.csproj 以在生成之前生成文件并在编译期间包含文件,但将它们排除在增量生成检查之外?

MSBuild T4 CSPROJ 增量生成

评论


答:

0赞 Jonathan Dodds 9/17/2023 #1

我怀疑问题是您不支持增量生成。目标没有分别针对 T4 文件和生成的文件的输入和输出TextTemplateTransform

假设这是一个文件集合,并且存在 to 的一对一关系,则修改目标定义,如下所示:@(TextTemplate).tt.tt.generated.cs

<Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild"
  Inputs="@(TextTemplate)"
  Outputs="@(TextTemplate->'%(Filename).generated.cs')">

这是特定于 Windows 的版本吗?您可能需要考虑使用 Modeling SDK 的文本转换目标文件,而不是编写和维护自己的目标。请参阅“在生成过程中调用文本转换”。TextTemplateTransform