C# 增量生成的MSBuild时间戳问题

C# 增量生成的MSBuild时间戳问题,c#,msbuild,t4,C#,Msbuild,T4,我有一个C#类库项目,它引用了另一个类库项目(EdmResources引用框架)。EdmResources仅包含一个T4模板,该模板始终在项目构建时执行,以编译和写出实体框架的EDMX文件 EdmResources项目总是构建,不管框架程序集是最新的还是需要构建,这会大大减慢我们的构建过程。我希望EdmResources仅在框架程序集需要重新编译时构建 我尝试将框架程序集的最后一次写入时间输出为EdmResources.tt的输出,然后仅当程序集的最后一次写入时间大于模板输出文件中记录的时间戳时

我有一个C#类库项目,它引用了另一个类库项目(EdmResources引用框架)。EdmResources仅包含一个T4模板,该模板始终在项目构建时执行,以编译和写出实体框架的EDMX文件

EdmResources项目总是构建,不管框架程序集是最新的还是需要构建,这会大大减慢我们的构建过程。我希望EdmResources仅在框架程序集需要重新编译时构建

我尝试将框架程序集的最后一次写入时间输出为EdmResources.tt的输出,然后仅当程序集的最后一次写入时间大于模板输出文件中记录的时间戳时才生成EDMX

但这不起作用,因为MSBuild总是更新框架程序集的最后一次写入时间,即使没有任何更改并且代码没有重新编译

基本上,是否有一种方法可以在框架项目的构建过程中从MSBuild生成反映真实构建时间戳的信号文件?也就是说,它只有在某些代码实际被重新编译时才会得到更新。然后可以使用该文件,而不是框架程序集上的上次写入时间


谢谢

我找到了一个好办法。我将此代码放在顶部的框架项目文件中:

<PropertyGroup>
   <TargetsTriggeredByCompilation>
        $(TargetsTriggeredByCompilation);
        AfterCompilation
    </TargetsTriggeredByCompilation>
</PropertyGroup>

$(targetStrigeredByCompilation);
编后
然后在文件底部添加了AfterCompilation目标:

<!-- This target will be called by CoreCompile only when it runs -->
<Target Name="AfterCompilation" >
    <!-- Output Timestamp File -->
    <ItemGroup>
      <SignalFile Include="$(OutDir)MyCompany.Framework.timestamp" />
    </ItemGroup>
    <PropertyGroup>
      <Ticks>$([System.DateTime]::Now.Ticks)</Ticks>
    </PropertyGroup>
    <WriteLinesToFile File="@(SignalFile)" Lines="$(Ticks)" Overwrite="true" />
</Target>

$([System.DateTime]::Now.Ticks)

因此,这意味着只有在代码编译时才会生成时间戳文件,如果从未调用CoreCompile目标,则不会更新时间戳文件。然后,我可以从T4模板中查看此时间戳文件,并正确确定是否也需要重建EDMX文件。

这是一个公平的问题,但我始终倾向于在生成服务器上重建所有内容。您是否尝试过调查为什么构建过程对一个项目花费如此长的时间?我不熟悉T4/Edmx/Entity,但有一次遇到了类似的问题(总是生成一个资源,导致项目总是被构建),并通过使用带有CodeTaskFactory的msbuild任务解决了这个问题,CodeTaskFactory执行
System.IO.File.SetLastWriteTime(DestFile,System.IO.File.GetLastWriteTime(SourceFile))
。也许类似的事情对您很有用,例如,强制将文件的时间戳设置为您知道的足够“旧”的东西?我们总是在构建服务器上重建所有内容-问题是当开发人员编写测试时,只想重新编译他们的测试项目。有时VS会正确地执行,只需重新编译测试项目,但事实并非如此有时它会首先检查所有引用。这会触发资源项目始终构建,即使其他引用是最新的,这也是需要优化的。