项目、props文件、Directory.Build.target、命令行指定Windows SDK的优先级是多少?
MSBuild Windows SDK版本优先级与配置优化结论
你的原有优先级判断存在两处错误,正确的MSBuild属性优先级从高到低如下:
- 最高:msbuild 命令行通过
/p:传入的全局属性,一旦指定,所有项目文件、props/targets文件的同属性配置都无法覆盖它 - 第二:.vcxproj 项目文件中显式定义的
WindowsTargetPlatformVersion属性 - 第三:项目中显式导入的
Company.props内的同属性配置 (仅当Company.props的导入语句写在.vcxproj自身属性定义之后时,才会覆盖项目内的配置,常规导入顺序下项目自身配置优先级更高) - 最低:自动导入的
Directory.Build.props/Directory.Build.targets内的同属性配置,MSBuild默认会在项目解析的最开始阶段导入目录下的这两个文件,后续任何位置的同属性定义都会覆盖它的配置
关于你提到的「Directory.Build.props在Visual Studio本地构建不生效」的判断也不正确:只要该文件放在项目目录或者上层任意目录中,本地VS的构建逻辑和命令行MSBuild完全一致,会自动识别并导入该文件,除非本地环境手动配置了禁用目录级配置自动导入的规则。
配置简化方案(避免版本不同步)
推荐按以下规则调整配置,仅需维护一处版本号即可覆盖所有场景:
- 首先删除Azure DevOps构建步骤中给msbuild.exe传递的
/p:WindowsTargetPlatformVersion=10.0.18362.0参数,避免最高优先级的硬编码锁死版本 - 在
Company.props中添加SDK版本定义,同时增加防御性逻辑,仅当属性未被定义时才赋值,方便特殊项目自定义版本:<WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">10.0.18362.0</WindowsTargetPlatformVersion> - 在源码根目录的
Directory.Build.props中添加Company.props的导入逻辑,这样所有项目都可以自动导入统一配置,无需每个项目手动修改引入 - 逐步清理现有.vcxproj文件中硬编码的
WindowsTargetPlatformVersion配置,后续新项目禁止在项目文件中单独指定SDK版本
内容的提问来源于stack exchange,提问作者Mr. Boy
相关产品推荐
相关产品推荐

