当文件实际引用 v10时,找不到 Microsoft.WebApplication.target

首先是一些背景资料。在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,这是有意义的,因为我们不使用 VisualStudio2012。

这个错误同时发生在我们中的几个人身上,甚至发生在几个月没有更改的旧代码分支上。

我怀疑某些更新被推到了我们的机器上,把事情搞得一团糟,但我不知道该怎么办。

短期的解决方案是安装 VS 2012,而不是使用它,但我希望一些比这更干净。

73446 次浏览

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

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

在某些罕见的情况下,您可能需要安装特定版本的 VS 和 WebDeploy 包。在我的情况下,只是版本就足以解决问题。

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

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

编辑1

正如注释中提到的,每个新版本的 MSBuild 都带有一个新目录。对于 VisualStudio2015,使用 C:\Program Files (x86)\MSBuild\14.0\Bin

编辑2

正如注释中提到的,对于 VisualStudio2017,使用 C:\Program Files (x86)\Microsoft Visual Studio\2017\<Edition>\MSBuild\15.0\Bin\MSBuild.exe

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

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

我通过从另一个未受影响的构建服务器复制 v11文件夹解决了这个问题。

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

  1. 某些更新触发了 v11文件夹的删除。是 Windows 更新到.NET 还是什么?

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

我在12月3日更新了.NET Framework4.5.1,这是原因吗?

Brgds

乔纳斯

哇。我们刚刚在我们的构建机器上看到了同样的事情发生。我们使用 VS2010和目标。NET 4.0.我们的项目文件显式地导入这些目标的 v10.0版本。由于代码没有变化,昨天构建还好,今天却因为缺少 v11.0版本而失败。那个。NETFramework4.5.1昨晚在这个构建机器上作为自动更新安装/更新。我们将使用参数(或 env)强制 v10.0。变量) ,但这确实让我们感到惊讶..。

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

Format Version 12.00

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

在我们的案例中,尽管我们的目标是为2010/4.0开发所有的东西,但是一些开发者已经为 VS2012做好了准备(因为 MS 声称项目文件是兼容的) ,而且这个特殊的解决方案上一次保存(几个月前)是在 VS2012。在今天之前,这还不算什么问题。

黑客,但通过复制解决了这个问题: C: Program Files (x86) MSBuild Microsoft VisualStudio v10.0 WebApplications * . * 到 C: Program Files (x86) MSBuild Microsoft VisualStudio v11.0 WebApplications * . *

如果您有一个没有安装 VS2012的构建服务器,您可以通过

A)在解决方案中安装 MSBuild. Microsoft. VisualStudio. Web.target软件包,以及

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.x.x.x.x替换当前版本的 targets.11.0.2.1

我发现安装免费的 VisualStudio2012Shell (独立)会安装 WebApplications v11 MSBuild 文件。比完整安装的 VisualStudio2012要轻,而且没有许可问题。

解决这个问题的一个简单方法是:

走下列路线:

C: Program Files (x86) MSBuild MicrosoftVisualStudio

根据 Visual Studio 2010、2012或2013的安装,您将看到最新版本 V10.0、 v11.0、 v12.0。

从最新版本目录复制 WebApplications文件夹并粘贴到其他目录。

你的问题应该得到解决。

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

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

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

幸运的是,我发现了多诺万 · 布朗(Donovan Brown)的这篇非常有帮助的文章: Http://donovanbrown.com/post/so-sick-of-microsoftwebapplicationtargets-was-not-found-build-errors !

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

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

转到“处理”-> “3. 高级”

并将“ MSBuild 参数”设置为

/p:VisualStudioVersion=12.0

我也有同样的问题。通过以上列出的解决方案修正。之所以出现此问题,是因为在生成服务器上没有适当版本的 VisualStudioTools (BuildTools)。如前所述,这可以通过安装 BuildTools 来解决,但在我的情况下不是这种选择。

这里是另一个可供选择的使用 Nuget

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

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

在 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')" />

希望这个能帮上忙! 祝你好运,

干杯,