当文件实际引用v10时,找不到v11.0 \ WebApplications \ Microsoft.WebApplication.targets


84

首先介绍一些背景。在2012年底,我们将vs2008解决方案迁移到了vs2010,但我们仍然以.NET 3.5为目标。(除了这里的最新和最伟大的,我什么都不知道!)

直到几周前人们开始出现以下错误时,我们才对该设置没有任何问题:

"foo.csproj" (Rebuild target) (16:5) ->
  C:\...\foo.csproj(142,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 declaration is correct, and that the file exists on disk.

有趣的是,如果您查看项目文件,它会引用v10,这很有意义,因为我们不使用Visual Studio 2012。

这个错误一下子击中了我们几个人,甚至击中了几个月来都没有改变的旧代码分支。

我怀疑有些更新被推送到我们的机器上,使事情变得混乱,但是我不知道该怎么办。

短期解决方案是安装VS 2012而不使用它,但我希望能有比这更清洁的东西。


17
我发现将“ /p:VisualStudioVersion=10.0”添加到MSBuild命令行可以使此操作消失,但是仍然感觉像是黑客。
drs9222 2013年

Answers:


116

我遇到了与Visual Studio 2013相同的问题。事实证明,我是从命令行使用旧版本的MSBuild(.NET Framework附带的旧版本)。Microsoft现在将MSBuild作为Visual Studio本身的一部分以及作为单独的安装程序发布(http://blogs.msdn.com/b/visualstudio/archive/2013/07/24/msbuild-is-now-part-of- visual-studio.aspx)。

解决方案是使用位于中的新版本的MSBuild.exe C:\Program Files (x86)\MSBuild\12.0\Bin。一旦这样做,所有目标错误都消失了。

编辑1

如评论中所述,每个新版本的MSBuild都带有一个新目录。对于Visual Studio 2015,请使用C:\Program Files (x86)\MSBuild\14.0\Bin

编辑2

如注释中所述,对于Visual Studio 2017,请使用C:\Program Files (x86)\Microsoft Visual Studio\2017\<Edition>\MSBuild\15.0\Bin\MSBuild.exe


1
我在TeamCity论坛上发布了一个请求,以合并新路径(例如如何处理NuGet设置)。希望他们能尽快解决这个问题。
David Peden 2013年

1
博客文章中指向单独工具下载的直接链接不再有效。正确的链接是:microsoft.com/en-us/download/details.aspx?id=40760
David Peden 2013年

1
而且,就像这样,Jetbrains推出了8.0.5版。官方博客文章:teamcitydev.blogspot.com/2013/11/…–
David Peden

1
如果您有本地Powershell构建脚本,则可以简单地添加到路径中:$env:Path = $env:Path + ";C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\WebApplications"并使用v4 msbuild(也可以在构建框中执行此操作)
Chris S

4
是! 谢谢-这是正确的解决方案。
Josh M.

52

如果您的构建服务器未安装VS2012,则可以通过以下方法解决此问题:

a)将MSBuild.Microsoft.VisualStudio.Web.targets程序包安装到您的解决方案中,以及

b)替换.csproj文件中的这一行:

<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />

该行指向nuget包

<Import Project="..\packages\MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1\tools\VSToolsPath\WebApplications\Microsoft.WebApplication.targets" Condition="true" />

编辑

作为@joedragons指出在更新行的版本应该匹配NuGet包版本,如更换targets.11.0.2.1targets.x.x.x.x当前版本。


1
同样,很好的建议!
凯文·奥比

2
谢谢,伟大的解决方案
Pavel 2015年

1
也许很明显,但是您替换的行应该包含您安装的软件包的版本。我安装的是12.0.4,所以当我放入替换导入时,出现了相同的错误。当我切换到... Web.targets.12.0.4 \ ... all good =)非常感谢!
joedragons

2
您不再需要此答案的b部分。由于某种原因,SO拒绝了我的删除多余细节的编辑。
bbodenmiller

1
谢谢,我对最新版本的MSBuild.Microsoft.VisualStudio.Web.targets.14.0.0.3执行了相同的操作
Ahmed Samir

23

这个问题的简单解决方案:

转到以下路径:

C:\ Program档案(x86)\ MSBuild \ Microsoft \ VisualStudio

您将看到最新版本的V10.0,v11.0,v12.0,具体取决于您的Visual Studio 2010、2012或2013安装。

WebApplications从最新版本目录之一复制文件夹,然后粘贴到其他目录。

您的问题应得到解决。


1
这个IMO是最好,最简单的解决方案:)
gideon

当然,它要求您实际上有权在构建服务器上执行此操作。
戴夫

1
...但是为什么我们必须手动执行此操作?谢谢..这为我在VS21017中修复了它(对我来说,它是仅与VS2017一起全新安装-现在我认为这是因为我尚未安装IIS)
Piotr Kula

复制到V14.0时也可以使用。
Uwe Keim


8

哇。我们只是在构建机器上看到了同样的事情。我们使用VS2010,目标是.NET 4.0。我们的项目文件明确导入了这些目标的v10.0版本。无需更改代码,昨天的构建就可以了,今天却因抱怨缺少v11.0版本而失败。.NET Framework 4.5.1昨晚已在此生成计算机上安装/更新为自动更新。我们将使用参数(或env。变量)强制v10.0,但这肯定使我们感到惊讶...

更新:更奇怪的是,似乎今天的msbuild版本正在使用sln文件的第一行来确定默认使用哪个VisualStudioVersion,而昨天的版本却没有:

Format Version 12.00

我们测试了将其手动更改为11.00,然后构建再次开始工作。

在我们的案例中,即使我们要针对2010 / 4.0构建所有目标,但一些开发人员已经为VS2012作好了准备(因为MS声称项目文件兼容),并且这个特定的解决方案最近一次保存在(几个月前)中。 VS2012。在今天之前,这并没有引起问题。


1
这给我的帮助远远超过似乎是完全不同的情况的投票最高的答案。
LambdaCruiser 2014年

同样在这里@LambdaCruiser,这个答案很有帮助。我查看了我的.sln文件的历史,然后第二行读到# Visual Studio 2010第一行以结束,Format Version 12.00因为在某个阶段我已经升级到vs2012,但来回切换到vs2010。像韦恩一样,在CI服务器上运行Windows更新后也会发生此问题
wal

6

我遇到过同样的问题。通过上述解决方案解决。引起此问题的原因是在构建服务器上没有适当版本的Visual Studio工具(BuildTools)。正如上面正确指出的那样,可以通过安装BuildTools来解决此问题,但就我而言,这不是选项。

这是另一种选择-使用Nuget

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

确定启动项目,并根据所使用的Visual Studio版本安装web.targets。以下文件将被修改,其中包括所需的更改

在packages.config中:

<package id="MSBuild.Microsoft.VisualStudio.Web.targets" version="14.0.0.3" targetFramework="net45" />

在.csproj中:

<Import Project="..\packages\MSBuild.Microsoft.VisualStudio.Web.targets.14.0.0.3\build\MSBuild.Microsoft.VisualStudio.Web.targets.props" Condition="Exists('..\packages\MSBuild.Microsoft.VisualStudio.Web.targets.14.0.0.3\build\MSBuild.Microsoft.VisualStudio.Web.targets.props')" />

希望这可以帮助!!!祝好运,

干杯,


1
完美的答案-不再需要使用csproj文件或在构建服务器上复制内容。适用于Visual Studio和MSBuild 2017的多个版本。尽管如此,我还是手动删除了“ WebApplication.targets”行-nuget不会自动删除它。
Gedas Kutka '18

3

Hack,但通过以下方式解决了问题:将c:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ WebApplications *。*复制到c:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ WebApplications *。*


1

我在11月底收到此错误,但未对TeamCity安装或MSBuild安装的配置或源代码进行任何更改。在我的构建服务器上甚至没有安装Visual Studio,并且从VS2010到VS2012的更改是在8月底进行的,当时没有任何问题。

我的MSBuild版本是4.0.30319.18408,我的构建服务器是带有TeamCity v6.5.3的Windows Server 2008 R2 SP1。

我通过简单地从另一个不受影响的构建服务器复制v11文件夹来解决该问题。

我的猜测是这可能以两种方式发生:

  1. 更新了某些内容,导致删除了v11文件夹。可能是Windows更新到.NET或其他内容吗?

  2. 更新了某些内容,将我的TeamCity / MSBuild配置从使用v10更改为v11,并且由于v11不再存在,因此构建停止工作。

我在12月3日更新了.NET Framework 4.5.1,这可能是原因吗?

g

乔纳斯


0

我最近遇到了同样的问题。我的结论是,VS的每个版本(v10,v11,v12)都会更改构建变量的路径,例如MSBuildBinPath

因此,指定VS的确切版本并不是一件容易的事,因为您甚至可能没有安装适当版本的文件。因此,最好您指定一个参数并使用计算机上存在的目标。

在极少数情况下,您可能需要安装特定版本的VS和Web Deploy软件包。就我而言,仅仅版本就足以解决问题。


0

您可以像这样添加VisualStudioVersion属性:

<ItemGroup>
  <ProjectToBuild Include="$(MSBuildProjectDirectory)\..\MySolution.sln">
    <Properties>Configuration=$(BuildConfiguration);WarningLevel=0;VisualStudioVersion=12.0</Properties>
  </ProjectToBuild>
</ItemGroup>
<MSBuild Projects="@(ProjectToBuild)" Targets="Rebuild"/>

0

当我搜索如何解决此问题时,几乎每个人都建议复制丢失的MSBUILD文件夹或安装某些版本的SDK。

幸运的是,我发现了Donovan Brown撰写的这篇非常有用的文章:http : //donovanbrown.com/post/So-sick-of-MicrosoftWebApplicationtargets-was-not-found-build-errors!

简而言之,该想法是配置您的构建应在构建定义中使用的VisualStudio版本:

右键单击->“编辑构建定义...”

转到“过程”->“ 3。高级”

并设置“ MSBuild参数”

/p:VisualStudioVersion=12.0

VS2019中找不到“编辑构建定义...”
Laser42,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.