如何从生成文件读取内容设置MSBuild CustomBuild的AdditionalInputs
实现方案
你需要通过MSBuild的项分批机制,逐个读取每个源文件对应的依赖文件,将读取到的路径绑定到对应源文件的AdditionalInputs元数据上,再传递给CustomBuild任务即可,完整实现如下:
首先提前给每个源文件指定对应的依赖文件路径:
<ItemGroup> <!-- 替换后缀和DepsFile路径为你实际的规则 --> <CustomSources Include="*.cpp"> <!-- 示例为cpp源文件,按需修改 --> <DepsFile>$(IntDir)%(Filename).d</DepsFile> <!-- 对应每个源文件生成的依赖文件路径 --> </CustomSources> </ItemGroup>
然后新增读取依赖的目标,用分批逻辑处理每个源文件:
<!-- 按每个CustomSource分批执行,单独读取对应的依赖文件 --> <Target Name="ReadCustomDependencies" Outputs="%(CustomSources.Identity)"> <ReadLinesFromFile File="%(CustomSources.DepsFile)" Condition="Exists('%(CustomSources.DepsFile)')"> <Output TaskParameter="Lines" ItemName="_TempDependencyFiles" /> </ReadLinesFromFile> <!-- 将依赖写入当前源文件的AdditionalInputs元数据,源文件本身也要加入避免漏判变更 --> <ItemGroup> <CustomSources Condition="'%(Identity)' == '%(CustomSources.Identity)'"> <AdditionalInputs>%(CustomSources.Identity);@(_TempDependencyFiles)</AdditionalInputs> </CustomSources> <!-- 清空临时变量,避免分批时不同源文件的依赖互相污染 --> <_TempDependencyFiles Remove="@(_TempDependencyFiles)" /> </ItemGroup> </Target>
最后修改你的Custom目标,依赖读取逻辑后传递参数:
<Target Name="Custom" Condition="'@(CustomSources)' != ''" DependsOnTargets="ReadCustomDependencies"> <ItemGroup> <CustomItem Include="@(CustomSources)"> <Command> <!-- 你原来的执行命令 --> </Command> <!-- 直接读取之前绑定的AdditionalInputs元数据 --> <AdditionalInputs>%(CustomSources.AdditionalInputs)</AdditionalInputs> </CustomItem> </ItemGroup> <CustomBuild Sources="@(CustomSources)" /> </Target>
注意事项
- 首次构建时依赖文件还未生成,会全量执行CustomBuild,生成依赖文件后后续构建就会自动按依赖文件判断增量,符合预期
- 如果依赖文件内的路径是相对路径,需确保是相对于项目文件的路径,否则需要提前拼接为绝对路径,避免MSBuild文件变更判断失效
- 如果依赖文件的生成逻辑也是你的构建流程的一部分,需要把依赖文件的生成目标加到
ReadCustomDependencies的DependsOnTargets里,保证读取时文件已经生成
内容的提问来源于stack exchange,提问作者Teris
相关产品推荐
相关产品推荐

