在 MSBuild 文件中获取 VS 2017 的正确 $(VisualStudioVersion)

Get the correct $(VisualStudioVersion) for VS 2017 inside a MSBuild file

我有一个 MSBuild 文件,用于将解决方案(在 VS 2013 中创建并移植到 VS 2017)发布到远程服务器。违规行是这一行:

<PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup> 

当我运行命令时:

"C:\Program Files (x86)\Microsoft Visual Studio17\Professional\MSBuild.0\Bin\msbuild" WebSite1_Web_configs.build /p:Configuration=Integracion;Platform="AnyCPU" /p:VisualStudioVersion=15.0

经过一些编译,它以这个错误结束:

Error MSB4062 The "TransformXml" task could not be loaded from the assembly C:\Program Files (x86)\Microsoft Visual Studio17\Professional\MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll

当然不能加载,因为版本应该是15.0,不是12.0。

我尝试过的东西:

<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

对于:

<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

没用。

那么,如何在 MSBuild 文件中使用 $(VisualStudioVersion) 获得正确的 VS 版本而无需对其进行硬编码?

好的,问题是我在 *.build 文件的末尾有 <Import> 个元素。其中一个导入有部分路径被硬编码:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" />

我改成了:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" />

我使用 /p:VisualStudioVersion=15.0 参数执行了 MSBuild,它成功了。

如果您遇到同样的问题,请检查您的导入是否包含硬编码路径

在 Visual Studio 2017 年,无需编辑 .csproj 文件,您可以简单地转到 Visual Studio 包管理器控制台(工具 -> NuGet 包管理器 -> 包管理器控制台)并安装 Web.Targets:

Install-Package MSBuild.Microsoft.VisualStudio.Web.targets