[英]Build target used by Visual Studio to do Incremental Build via msbuild command line
[英]MSBuild timestamp issue with incremental build
我有一个C#类库项目,它引用了另一个类库项目(EdmResources参考框架)。 EdmResources仅包含一个T4模板,该模板始终在项目构建时执行,以为实体框架编译和写出EDMX文件。
EdmResources项目始终在构建,无论Framework程序集是最新的还是需要构建的-这都会大大减慢我们的构建过程。 我想要的是让EdmResources仅在框架程序集需要重新编译时才构建。
我尝试将Framework程序集的最后写入时间输出为EdmResources.tt的输出,然后仅在程序集上的最后写入时间大于模板的输出文件中记录的时间戳时才进行EDMX生成。
但是,这不起作用,因为MSBuild始终更新Framework程序集的最后写入时间,即使没有更改并且代码没有重新编译也是如此。
基本上,有没有一种方法可以在Framework项目的构建过程中从MSBuild生成反映真实构建时间戳记的信号文件? IE,只有在实际重新编译某些代码时,它才会更新。 然后可以使用该文件代替Framework程序集上的写入时间。
谢谢!
我找到了一个很好的解决方案。 我将此代码放在顶部的我的Framework项目文件中:
<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文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.