如何在增量构建场景下正确使用<MSBuild>任务?
实现方案
第一步:给BatchDeps目标添加增量检查
MSBuild的自定义目标默认不会做增量判断,需要显式指定Inputs(目标依赖的输入文件)和Outputs(目标生成的输出文件),MSBuild会自动对比两者的时间戳,只有输入更新时才会执行目标。
修改你的BatchDeps目标如下,路径可以根据你的实际项目结构调整:
<Target Name="BatchDeps" Inputs="$(SolutionDir)A\A.csproj;$(SolutionDir)A\**\*.cs;$(SolutionDir)A\**\*.resx" Outputs="$(SolutionDir)A\bin\Config1\A.dll;$(SolutionDir)A\bin\Config1\A.pdb;$(SolutionDir)A\bin\Config2\A.dll;$(SolutionDir)A\bin\Config2\A.pdb"> <MSBuild Projects="$(SolutionPath)" Targets="A" Properties="Configuration=Config1" SkipNonexistentTargets="True"/> <MSBuild Projects="$(SolutionPath)" Targets="A" Properties="Configuration=Config2" SkipNonexistentTargets="True"/> </Target>
- Inputs里可以按需加入A的其他依赖文件(比如配置文件、资源文件等),如果嫌匹配所有源码麻烦,也可以只填A的项目文件,缺点是只有修改A的项目配置时才会触发A的重编,修改源码不会触发。
- Outputs必须包含A在两个配置下所有你需要依赖的输出文件,确保和实际生成路径一致。
第二步:将A的输出加入B的编译输入依赖
要避免B的构建直接提示“所有输出均为最新”,需要把A的两个配置的输出文件加入到B的编译增量检查的输入列表里,MSBuild会自动检查这些文件的时间戳,只要有更新就会触发B的重新构建。
直接在B的项目文件里加入如下配置即可:
<ItemGroup> <!-- 替换为你的A项目对应配置的实际输出路径 --> <CustomAdditionalCompileInputs Include="$(SolutionDir)A\bin\Config1\A.dll" /> <CustomAdditionalCompileInputs Include="$(SolutionDir)A\bin\Config2\A.dll" /> </ItemGroup>
CustomAdditionalCompileInputs是MSBuild内置的项组,所有加入这个组的文件都会被作为编译目标的输入参与增量检查,不需要修改原有Build目标的逻辑。
验证方法
修改A项目的任意源码文件,触发B的构建:
- 首先会判定BatchDeps目标的输入更新,执行A的两个配置的构建
- 之后判定B的编译输入更新,执行B的正常构建
不会再出现直接跳过构建提示最新的问题。
内容的提问来源于stack exchange,提问作者PixelRick
相关产品推荐
相关产品推荐

