【问题标题】:MSBuild timestamp issue with incremental build增量构建的 MSBuild 时间戳问题
【发布时间】:2014-12-14 23:47:54
【问题描述】:

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

EdmResources 项目始终构建,无论框架程序集是最新的还是需要构建 - 这大大减慢了我们的构建过程。我想要的是 EdmResources 仅在需要重新编译框架程序集时才构建。

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

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

基本上,有没有办法在构建框架项目期间从 MSBuild 生成反映真实构建时间戳的信号文件? IE,只有在实际重新编译某些代码时才会更新。然后可以使用该文件代替框架程序集的最后写入时间。

谢谢!

【问题讨论】:

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

标签: c# msbuild t4


【解决方案1】:

我找到了一个很好的解决方案。我将此代码放入我的框架项目文件的顶部:

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

然后在文件底部添加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>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2019-05-31
    • 2022-11-09
    • 1970-01-01
    • 2011-03-16
    相关资源
    最近更新 更多