编写 Target 检测 MSBuild / dotnet build 此次编译是否是差量编译
MSBuild 或 Roslyn 编译项目时均支持差量编译,毕竟为了性能。我在 每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译 一文中介绍了如何使一个 Target 支持差量编译。在那篇文章中我说到差量编译会导致 Target 不执行;也就是说,如果一个 Target 对后续的编译会产生影响,那么一定不能设置为差量编译。
不过,真的会写出一些非常耗时的 Target,但是它会对后续的编译产生影响。这些 Target 如果要做差量编译,那么就不能直接使用原生的差量编译方案了。本文将介绍如何处理这样的情况。
我们遇到的问题
SourceFusion 是一个预编译框架,它在你编译期间对你的代码做一些改变。dotnet-campus/SourceFusion: SourceFusion is a pre-compile framework based on Roslyn. It helps you to build high-performance .NET code.。
这意味着,这个耗时的 Target 是会改变后续的编译的,典型的是 —— 它会在编译期间增加和删除几个源代码文件。如果完全使用 Target 原生的差量编译,那么一旦这个 Target 跳过,那么也就不会增加和删除任何源代码文件了。
解决方案
解决方案是,我们写一个前置的 Target,这个 Target 支持差量编译。于是我们可以利用它的差量编译特性得知当前是否处于差量编译的状态。
<Target Name="_WalterlvDemoRebuildingTest" BeforeTargets="WalterlvDemoCoreTarget"
        Inputs="$(MSBuildProjectFullPath)" Outputs="$(WalterlvDemoFolder)RebuildingTest.txt">
  <PropertyGroup>
    <WalterlvDemoRebuildRequired>true</WalterlvDemoRebuildRequired>
  </PropertyGroup>
  <ItemGroup>
    <RebuildingTestLine Include="true" />
  </ItemGroup>
  <WriteLinesToFile File="$(WalterlvDemoFolder)RebuildingTest.txt" Lines="@(RebuildingTestLine)" Overwrite="True" />
</Target>
上面的 Target 中,_WalterlvDemoRebuildingTest 是我给这个差量编译测试 Target 取的名字,WalterlvDemoCoreTarget 是那个耗时的 Target。
根据我在 每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译 一文中的差量编译的做法,我使用 $(MSBuildProjectFullPath) 也就是 csproj 文件的改变来决定差量检测的输入,用一个临时的文件 RebuildingTest.txt 来决定差量编译的输出。
在这里,我们一定需要一个文件来输出,这样 MSBuild 或者 Roslyn 检测差量的时候才能正确完成。这样,为了得到这个文件,我们实际上需要通过这个 Target 真的写一个文件出来,所以我们用了 WriteLinesToFile。
实际上,我们真正需要的是 WalterlvDemoRebuildRequired 这个属性。我们可以通过这个属性判断为 true 来得知当前并非差量状态,而是需要重新编译。
后续使用
对于我们真实的耗时的 Target,则需要检测这个 WalterlvDemoRebuildRequired 的值,进行不同的处理。
<Target Name="WalterlvDemoCoreTarget" BeforeTargets="CoreCompile">
  <PropertyGroup>
    <WalterlvDemoRebuildRequired Condition="'$(WalterlvDemoRebuildRequired)' == ''">false</WalterlvDemoRebuildRequired>
  </PropertyGroup>
  <Exec ConsoleToMSBuild="True" Command="WalterlvDemo.exe -r $(WalterlvDemoRebuildRequired)" />
</Target>
我们在核心的 Target 里面判断 WalterlvDemoRebuildRequired 的值,如果没有被设置,说明前面的 Target 没有执行,也就是“被差量”了,我们就可以将之指定为 false。
这样,核心的 Target 里面,也就是 WalterlvDemo.exe 执行参数中,就可以拿到正确的差量状态了。true 表示正在重新编译,而 false 表示正在差量编译。
编写 Target 检测 MSBuild / dotnet build 此次编译是否是差量编译的更多相关文章
- 每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译
		如果你干预到了项目的编译过程,可能就需要考虑到差量编译了.不然--当你的项目大起来的时候,就会感受到每次都重新编译时,每次重复调试的过程都要进行漫长等待时的绝望和无奈. 如果你正遭遇差量编译失效,每次 ... 
- How to output the target message in dotnet build command line
		How can I output my target message when I using dotnet build in command line. I use command line to ... 
- 使用 MSBuild 响应文件 (rsp) 来指定 dotnet build 命令行编译时的大量参数
		在为开源项目 easiwin/MSTestEnhancer 进行持续集成编译时,需要在编译命令中传入较多的参数.这对于新接手此项目的人来说,成本还是高了一点儿.本文将介绍 MSBuild 响应文件 ( ... 
- .NET Core的“dotnet restore”、“dotnet build”和“dotnet run”命令都是用来干什么的?
		dotnet restore 源代码:https://github.com/dotnet/cli/tree/rel/1.0.0/src/dotnet/commands/dotnet-restore 入 ... 
- The `XXXX` target overrides the `HEADER_SEARCH_PATHS` build setting defined in `Pods/Target Support Files/Pods-game-desktop/Pods-game-desktop.release.xcconfig'. This can lead to prob
		The `game-desktop [Release]` target overrides the `HEADER_SEARCH_PATHS` build setting defined in `Po ... 
- 使用dotnet build时复制引用dll到生成目录
		默认配置下dotnet build只会输出项目代码的dll,依赖用的是dotnet缓存中的dll,只有dotnet publish才会把依赖的dll一起输出到生成目录. 在项目csproj文件中添加以 ... 
- linux编写脚本检测本机链接指定IP段是否畅通
		linux编写脚本检测本机链接指定IP段是否畅通,通过ping命令检测指定IP,检测命令执行结果,若为0表示畅通,若为1表示不通,以此判断网络是否畅通,但是指定机器禁用ping命令除外.代码如下: # ... 
- 【lombok】使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法
		错误如题:使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法 报错如下: 解决方法: 1.首先查看你的lombok插件是否下载安 ... 
- 【转】Android 4.3源码的下载和编译环境的安装及编译
		原文网址:http://jingyan.baidu.com/article/c85b7a641200e0003bac95a3.html 告诉windows用户一个不好的消息,windows环境下没法 ... 
随机推荐
- 121. Best Time to Buy and Sell Stock(股票最大收益)
			Say you have an array for which the ith element is the price of a given stock on day i. If you were ... 
- 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018) Solution
			A. Numbers Unsolved. B. Broken Watch Solved. 题意: 一个圆盘上,有等分的n块区域,有三根指针,当三根指针分别位于两块区域的交界处时 指针的三点相连会形成一 ... 
- AVAudioFoundation(4):音视频录制
			本文转自:AVAudioFoundation(4):音视频录制 | www.samirchen.com 本文主要内容来自 AVFoundation Programming Guide. 采集设备的音视 ... 
- Mysql优化原则_小表驱动大表IN和EXISTS的合理利用
			//假设一个for循环 ; $i < ; $i++) { ; $i < ; $j++) { } } ; $i < ; $i++) { ; $i < ; $j++) { } } ... 
- 20145325张梓靖 《Java程序设计》第9周学习总结
			20145325张梓靖 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC Java语言访问数据库的一种规范,是一套API.JDBC (Java Database Connec ... 
- jquery.validation.js 使用
			引用文件: "~/assets/global/plugins/jquery-validation/js/jquery.validate.min.js", "~/asset ... 
- sqlite中的时间
			插入时间的sql语句 ','-61') 时间格式'2014-11-17T19:37:32' 年月日和时分秒之间多了一个字母T,保存到数据库的时候,会自动给时间加8个小时. 保存的结果为2014-11- ... 
- 微信小程序登录,获取code,获取openid,获取session_key
			微信小程序登录 wx.login(Object object) 调用接口获取登录凭证(code).通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session ... 
- [原][osg][osgearth]我眼中的osgearth
			看了一下,OE生成的可执行文件 除了osg库和第三方库 OE生产最多的dll就是 osgdb_osgearth_XXXX.dll了 这些都是为了通过osgDB机制加载earth的数据用的. 所以,我觉 ... 
- Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量
			Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量 from:https://www.leiphone.com/news/201712/zbX22Ye5wD6CiwCJ.html 导语 ... 
