如何在MSBuild文件中获取VS2017正确的$(VisualStudioVersion)?
解决MSBuild中自动获取正确VisualStudioVersion的问题
看起来你的核心问题是旧的PropertyGroup配置强制默认使用VS2010的版本号,导致VS2017的MSBuild依然尝试加载旧版本的Microsoft.Web.Publishing.Tasks.dll。下面是几个无需硬编码的可靠解决方案:
方案1:修正VisualStudioVersion的默认值逻辑
把你原有的PropertyGroup替换成下面的配置,它会自动匹配当前MSBuild对应的VS版本,同时兼容新旧VS结构:
<PropertyGroup> <!-- 用当前MSBuild版本作为VisualStudioVersion的默认值,VS2017的MSBuild 15.0对应VS版本15.0,以此类推 --> <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">$(MSBuildToolsVersion)</VisualStudioVersion> <!-- 优先尝试标准路径 --> <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> <!-- 如果标准路径不存在(VS2017+的新结构),从MSBuild安装目录向上查找 --> <VSToolsPath Condition="!Exists('$(VSToolsPath)\Web\Microsoft.Web.Publishing.Tasks.dll')">$(MSBuildToolsPath)\..\..\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> </PropertyGroup>
这个配置的优势是:
- 不再硬编码旧版本号,自动跟随你使用的MSBuild版本
- 适配VS2017及以后的新目录结构,避免路径找不到的问题
方案2:直接导入正确的Web发布目标文件(推荐)
更省心的方式是让MSBuild自己处理路径,直接导入官方的Web发布目标文件,它会自动设置正确的工具路径和任务:
<!-- 先尝试标准路径导入VS Web发布目标 --> <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets')" /> <!-- 如果标准路径不存在,适配VS2017+的MSBuild目录结构 --> <Import Project="$(MSBuildToolsPath)\..\..\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" Condition="!Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets') And Exists('$(MSBuildToolsPath)\..\..\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets')" />
额外检查点
- 确认你的build文件中没有其他地方覆盖
VisualStudioVersion属性,避免命令行传入的值被覆盖 - 保持命令行中的MSBuild路径正确,你当前使用的VS2017 Professional版本的路径是没问题的
内容的提问来源于stack exchange,提问作者tastydb
相关产品推荐
相关产品推荐

