如何通过MSBuild组合配置实现跨Windows与Linux DevContainer环境并行构建并排除指定文件夹
如何通过MSBuild组合配置实现跨Windows与Linux DevContainer环境并行构建并排除指定文件夹
嘿,我刚好搞定了在Windows本地Visual Studio和Linux DevContainer里并行构建项目的问题,核心就是靠MSBuild的条件配置给不同环境分配独立的构建输出目录,这样两边的产物完全隔离,不会互相干扰。下面是具体的实现方案:
核心配置文件:Directory.Build.props
直接在项目根目录创建(或修改)这个文件就行,MSBuild会自动让所有子项目继承它的配置,不用挨个项目去改,特别省心。
<Project> <!-- Windows 环境下的构建配置 --> <PropertyGroup Condition=" '$(OS.StartsWith(`Windows`))' == 'true' "> <!-- 指定Windows环境的中间输出目录 --> <MSBuildProjectExtensionsPath>$(MSBuildThisFileDirectory)$(MSBuildProjectName)\obj-windows\</MSBuildProjectExtensionsPath> <!-- 指定Windows环境的最终输出目录 --> <BaseOutputPath>$(MSBuildThisFileDirectory)$(MSBuildProjectName)\bin-windows\</BaseOutputPath> <!-- 临时屏蔽关于BaseIntermediateOutputPath的MSB3539警告 --> <NoWarn>MSB3539</NoWarn> </PropertyGroup> <!-- Linux DevContainer 环境下的构建配置 --> <PropertyGroup Condition=" '$(OS.StartsWith(`Windows`))' != 'true' "> <!-- 指定Linux环境的中间输出目录 --> <MSBuildProjectExtensionsPath>$(MSBuildThisFileDirectory)$(MSBuildProjectName)/obj-linux/</MSBuildProjectExtensionsPath> <!-- 指定Linux环境的最终输出目录 --> <BaseOutputPath>$(MSBuildThisFileDirectory)$(MSBuildProjectName)/bin-linux/</BaseOutputPath> </PropertyGroup> </Project>
配置细节说明
- 环境自动识别:通过
$(OS.StartsWith(Windows))这个判断条件,MSBuild会自动区分当前是Windows本地还是Linux DevContainer环境,自动切换对应配置 - 独立产物目录:给Windows分配
obj-windows/bin-windows,Linux分配obj-linux/bin-linux,彻底避免两边构建产物互相覆盖的问题,并行构建完全无冲突 - 路径适配:Windows用系统习惯的反斜杠
\,Linux用正斜杠/,符合各自系统的路径规范 - 临时警告处理:Windows环境里的
NoWarn>MSB3539是临时屏蔽关于BaseIntermediateOutputPath的提示,等后续项目调整或MSBuild更新后可以移除
备注:内容来源于stack exchange,提问作者Pieterjan




