在 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。
我尝试过的东西:
将 /p:VisualStudioVersion=15.0
添加到我调用 MSBuild 的命令中。没用。
在 *.csproj 文件中更改元素:
<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
我有一个 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。
我尝试过的东西:
将
/p:VisualStudioVersion=15.0
添加到我调用 MSBuild 的命令中。没用。在 *.csproj 文件中更改元素:
<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