如何向MSBuild解决方案添加可构建同方案其他项目的项目或目标
解决方案级MSBuild批量Rebuild目标实现方法
最简便的无侵入实现方式是利用MSBuild原生的解决方案目标导入规则,不需要修改现有sln或子项目文件。
实现步骤
- 新建解决方案级目标文件
在你的mysolution.sln同级目录下,创建和sln同名、后缀为.sln.targets的文件,即命名为mysolution.sln.targets。MSBuild解析sln时会自动识别并导入这个文件,不需要手动做关联配置。 - 写入RebuildAll目标逻辑
把下面的XML内容写入新建的targets文件:
字段说明:<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="RebuildAll"> <MSBuild Projects="@(ProjectReference)" Targets="Rebuild" Properties="Configuration=$(Configuration);Platform=$(Platform)" BuildInParallel="true" /> </Target> </Project>@(ProjectReference)是MSBuild解析sln时自动生成的项目列表,包含解决方案内所有子项目的路径,后续新增/删除解决方案内的项目时不需要手动修改这个列表,会自动同步BuildInParallel="true"开启多核并行构建,能大幅提升多项目构建速度,不需要的话可以直接删除该属性- 自动透传命令行传入的
Configuration、Platform等全局属性,不需要额外做参数映射
调用验证
直接执行你预期的命令即可生效:
msbuild mysolution.sln /t:RebuildAll /p:Configuration=Debug
执行时会自动遍历解决方案内所有子项目,逐个调用项目级的Rebuild目标完成构建。
扩展说明
- 如果需要适配其他批量操作,比如批量清理、批量执行自定义项目目标,只需要照着上述格式新增Target即可,比如实现CleanAll就把任务里的
Targets属性值改为Clean - 如果需要传递额外全局属性,直接在
Properties字段里追加即可,比如要指定统一输出目录可以写为Properties="Configuration=$(Configuration);Platform=$(Platform);OutDir=$(CustomOutDir)" - 调用时如果你的项目有平台区分(比如x86、x64),记得在命令行追加
/p:Platform=<目标平台>参数,否则会使用MSBuild默认平台配置构建。
内容的提问来源于stack exchange,提问作者videoguy
相关产品推荐
相关产品推荐

