12

我有一个 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 Studio\2017\Professional\MSBuild\15.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 Studio\2017\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">

它不起作用。

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

4

2 回答 2

15

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

<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" />

我用参数执行了 MSBuild,/p:VisualStudioVersion=15.0它工作了。

请,如果您有同样的问题,请检查您是否有使用硬编码路径的导入

于 2019-03-19T13:06:45.110 回答
1

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

Install-Package MSBuild.Microsoft.VisualStudio.Web.targets
于 2020-07-25T07:44:12.197 回答