MSbuild 对生成文件的最新检查无法按需要工作

问题描述 投票:0回答:1

我有一个 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 incremental-build
1个回答
0
投票
我怀疑问题是你不支持增量生成。您的

TextTemplateTransform

 目标分别没有 T4 文件和生成文件的 
输入和输出。 假设

@(TextTemplate)

.tt
文件的集合,并且
.tt
.generated.cs
存在一对一的关系,则修改目标定义如下:
<Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild"
  Inputs="@(TextTemplate)"
  Outputs="@(TextTemplate->'%(Filename).generated.cs')">

这是 Windows 特定版本吗?您可能需要考虑使用建模 SDK 的文本转换目标文件,而不是编写和维护您自己的 
TextTemplateTransform

目标。请参阅

“在构建过程中调用文本转换”

© www.soinside.com 2019 - 2024. All rights reserved.