提问人:Daniel S 提问时间:9/2/2023 更新时间:9/17/2023 访问量:52
对生成的文件进行 MSbuild 最新检查无法根据需要工作
MSbuild up-to-date check for generated files does not work as needed
问:
我有一个 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 "%(TextTemplate.FullPath)" -P="$(ProjectDir)..\TextTemplating" -I="$(ProjectDir)..\TextTemplating"" />
</Target>
我按照警告中建议的链接添加了“UpToDateCheck*”,但它似乎不起作用。
我还看到了另一个使用“<编译删除”的建议解决方案,它似乎确实有助于进行最新检查,但这样生成的文件就不包含在编译中。
有人遇到过类似的问题吗?如何更改 *.csproj 以在生成之前生成文件并在编译期间包含文件,但将它们排除在增量生成检查之外?
答:
我怀疑问题是您不支持增量生成。目标没有分别针对 T4 文件和生成的文件的输入和输出。TextTemplateTransform
假设这是一个文件集合,并且存在 to 的一对一关系,则修改目标定义,如下所示:@(TextTemplate)
.tt
.tt
.generated.cs
<Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild"
Inputs="@(TextTemplate)"
Outputs="@(TextTemplate->'%(Filename).generated.cs')">
这是特定于 Windows 的版本吗?您可能需要考虑使用 Modeling SDK 的文本转换目标文件,而不是编写和维护自己的目标。请参阅“在生成过程中调用文本转换”。TextTemplateTransform
评论