外部VS2013生成错误"错误MSB4019:找不到导入的项目<path>"

Sar*_*ger 200 c# web-applications build visual-build-professional visual-studio-2013

我正在通过命令行而不是在Visual Studio 2013中构建项目.注意,我已将项目从Visual Studio 2012升级到2013.项目在IDE中构建良好.另外,我首先完全卸载了VS2012,重新启动并安装了VS2013.我拥有的唯一Visual Studio版本是2013 Ultimate.

ValidateProjects:
    39>path_to_project.csproj(245,3): error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
    39>Done Building Project "path_to_project.csproj" (Clean target(s)) -- FAILED.
Run Code Online (Sandbox Code Playgroud)

以下是有问题的两条线:

<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
Run Code Online (Sandbox Code Playgroud)

原来的第二行是v10.0,但我手动将其更改为v12.0.

$(VSToolsPath)从我看到的扩展到v11.0(VS2012)文件夹,显然已不存在了.路径应该是v12.0.

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\WebApplications\
Run Code Online (Sandbox Code Playgroud)

我尝试在系统环境变量表中指定VSToolsPath,但外部构建实用程序仍使用v11.0.我尝试在注册表中搜索,但没有提到任何内容.

遗憾的是,我没有看到任何简单的方法来获得使用的确切命令行.我使用构建工具.

思考?

gia*_*min 250

我有同样的问题,找到一个更简单的解决方案

这是由于Vs2012在csproj文件中添加了这一部分:

<PropertyGroup>
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

您可以安全地删除该部分,您的解决方案将构建.

正如Sielu指出的那样,你必须确保.proj文件<Project ToolsVersion="12"在下次用visual studio 2010打开项目时开始,否则它将再次添加删除的节点.

否则,如果您需要使用webdeploy或使用构建服务器,则上述解决方案将无效,但您可以VisualStudioVersion在构建脚本中指定该属性:

msbuild myproject.csproj /p:VisualStudioVersion=12.0
Run Code Online (Sandbox Code Playgroud)

或编辑您的构建定义:

编辑构建定义以指定<code> VisualStudioVersion </ code>属性

  • 删除该行似乎打破了Web部署 (9认同)
  • 我使用了这个答案,只有当我确保我的*proj文件以<Project ToolsVersion ="12"开始时才有效.在我使用<Project ToolsVersion ="4"之前每次我在VS中打开项目时它再次添加了两个节点(即它将项目重新迁移到最新版本). (7认同)
  • 我使用上面推荐的/p:VisualStudioVersion=12.0属性解决了同样的问题.谢谢 (4认同)
  • @giammin,我已经找到了解决方案.请勿从项目文件中删除该部分.在构建定义中设置正确的工具版本.这很容易做到.打开构建定义并转到"Process"页面.然后在"3. Advanced"组下,您有一个名为"MSBuild Arguments"的属性.使用以下语法"/p:VisualStudioVersion=12.0"将参数放在那里.当然没有引号.如果您有更多参数,请用空格而不是逗号分隔它们.您建议删除的配置在构建过程中由visual studio的其他部分使用... (3认同)

Ral*_*sen 70

我也有这个,您可以通过在构建定义中设置工具版本来修复它.

这很容易做到.打开构建定义并转到" Process "页面.然后在" 3. Advanced "组下,您有一个名为" MSBuild Arguments " 的属性.使用以下语法将参数放在那里

/p:VisualStudioVersion=12.0 
Run Code Online (Sandbox Code Playgroud)

如果您有更多参数,请用空格而不是逗号分隔它们.

  • [Sayed Ibrahim Hashimi的文章](http://sedodream.com/PermaLink,guid,a5894bad-f2a1-441a-a5b2-74f16c6cf8aa.aspx)描述了Visual Studio 2010/2012中的问题.命令行构建使用sln文件格式版本-1作为VisualStudioVersion.您可以像Ralph描述的那样从命令行覆盖此值,或者从构建脚本中覆盖MSBuild任务的属性.我在Visual Studio 2013中遇到了同样的问题,并且重写VisualStudioVersion解决了这个问题. (2认同)

Jes*_*ter 50

这是密切相关的,但可能会或可能不会修复OP的具体问题.就我而言,我试图使用VS2013自动部署Azure站点.但是,通过VS工作构建和部署,使用MSBuild在"目标"周围显示了类似的错误.事实证明MSBuild在VS2013下是不同的,现在是VS的一部分而不是.Net Framework(参见http://timrayburn.net/blog/visual-studio-2013-and-msbuild/).基本上,使用正确版本的MSBuild:

老,VS2012

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
Run Code Online (Sandbox Code Playgroud)

新的,VS2013

C:\Program Files (x86)\MSBuild\12.0\bin\msbuild.exe
Run Code Online (Sandbox Code Playgroud)

更新,VS2015

C:\Program Files (x86)\MSBuild\14.0\Bin\msbuild.exe
Run Code Online (Sandbox Code Playgroud)

更新,VS2017(没有完全测试但发现 - 他们已经移动了一些东西)

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\msbuild.exe
Run Code Online (Sandbox Code Playgroud)


Sar*_*ger 22

我刚收到Kinook的回复,他给了我一个链接:

基本上,我需要在建造之前调用以下内容.我想Visual Studio 2013不会首先自动注册环境,但2012年确实如此,或者我做了并忘了.

call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
Run Code Online (Sandbox Code Playgroud)

希望这篇文章可以帮助别人.


小智 21

giammin的解决方案部分不正确.您不应该从解决方案中删除整个PropertyGroup.如果这样做,MSBuild的"DeployTarget = Package"功能将停止工作.此功能依赖于正在设置的"VSToolsPath".

<PropertyGroup>
  <!-- VisualStudioVersion is incompatible with later versions of Visual Studio.  Removing. -->
  <!-- <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> -->
  <!-- VSToolsPath is required by MSBuild for features like "DeployTarget=Package" -->
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
...
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
Run Code Online (Sandbox Code Playgroud)


Sco*_*ott 10

我的FSharp目标有这个问题(FSharpTargetsPath为空).

许多路径都是参考VS版本构建的.

由于各种原因,我们的构建以系统权限运行,环境变量"VisualStudioVersion"仅在"用户"级别设置(由VS 2013安装程序) - 这是公平的.

确保在您运行的级别(系统或用户)上将" VisualStudioVersion"环境变量设置为" 12.0".

  • 这可能是运行构建服务器(例如CruiseControl或TeamCity)时的常见情况,其中服务在特定服务帐户下运行,该服务帐户甚至可能没有交互式桌面权限.这个提示为我解决了这个问题(VS 2013安装在Server 2008 R2的干净安装上,使用CruiseControl.NET) (5认同)

小智 6

在命令行中运行它也将解决问题.SETX VisualStudioVersion"12.0"