在构建服务器上找不到 Microsoft.WebApplication.targets 文件。你有什么解决方法?

471

尝试在构建服务器上构建我的项目时,出现以下错误:

Microsoft (R) Build Engine Version 4.0.30319.1
error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\TeamData\Microsoft.Data.Schema.SqlTasks.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.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.
error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.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.

几个月前,我通过在Build Server上安装Visual Studio 2010来解决了这个问题。但现在我要从头开始设置一个新的服务器,想知道是否有更好的解决方案来解决这个问题。


1
Web应用程序项目已经过时了吗?我想知道为什么需要旧版本的Visual Studio才能构建它们的理由是什么? - brianary
1
更重要的是,你是否实际通过构建服务器进行部署?例如,我不这样做,我甚至在解决方案中有一个单独的Web安装程序项目...但它仍然需要这个该死的东西...答案=从proj文件中删除它!很容易。 - Paul Zahra
8
通过将路径<Import Project="..\Packages\MSBuild.Microsoft.VisualStudio.Web.targets.14.0.0.3\tools\VSToolsPath\WebApplications\Microsoft.WebApplication.targets" />替换为$(VSToolsPath),完成修复操作,修复后的代码如下: <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" /> - G J
24个回答

215

回答标题中的问题(但不回答关于您获得的输出的问题):

如果只是Web应用程序,则从开发机器复制以下文件夹到构建服务器可以解决此问题

C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications

根据您的构建出错情况,删除x86。如果您有其他项目类型,则可能需要复制整个msbuild文件夹。


11
将v10.0替换为v11.0后,这对于使用VS2012项目的m2有效。 - DenNukem
2
我们能否直接安装MSBuild工具而不是这个?http://www.microsoft.com/en-us/download/confirmation.aspx?id=40760 - user20358
1
哎呀,仅安装MSBuild工具是不足以构建在VisualStudio 2013中编译正常的项目的。 - Michael Shaw
我在安装了VS2013之后,不得不将Web文件夹复制到v11.0中才能使其正常工作,因为它在那里丢失了。可以在VS中编译,但不能直接通过MSBUILD进行编译。 - Martin Braun
10
曾在VS2017工作过。只需将C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\vXX.0\WebApplications复制到C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications即可。 - jokab
显示剩余2条评论

123
解决方法是在构建服务器代理上安装可再分发的包。可以通过多种方式实现,下面描述了其中的3种。选择最适合您的一种。

使用带有UI的安装程序

这是原始答案

现在,在2017年,您可以使用MSBuildTools安装WebApplication redists。只需转到此页面下载MSBuild 2017工具,并在安装时单击Web development build tools以安装这些目标: enter image description here

这将默认情况下在C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications中安装丢失的库。

使用命令行

免责声明 我没有测试以下任何提议

正如@PaulHicks和@WaiHaLee在评论中建议的那样,它也可以从CLI(无ui)以无头模式安装,这可能是解决远程服务器问题的首选方式。

  • 解决方案A-使用包管理器(choco)
choco install visualstudio2017-workload-webbuildtools
  • 解决方案B - 在无头模式下运行安装程序

    请注意,这是原始答案中建议使用的相同安装程序

vs_BuildTools.exe --add Microsoft.VisualStudio.Workload.WebBuildTools --passive

3
我很惊讶,我的五岁孩子知道如何将库打包到源代码控制中,并且这个答案甚至到今天仍在得到赞同,虽然它本来就是正确的答案。 - Andriy K
2
@AndriyK,你的解决方案与我建议的有些不同,我理解为什么有人可能更喜欢你的而不是我的……除非这只是懒惰的表现;D - SOReader
3
为了让这更通用,在未来版本的Visual Studio中,您可以从https://visualstudio.microsoft.com/downloads/下载最新的Build Tools。 滚动页面并在底部附近展开“Tools for Visual Studio”一节,然后下载“Build Tools for Visual Studio”。目前这些是针对VS 2017的,但我认为将来的版本也会是这样。顺便说一句,如果您需要CI工具(例如Jenkins)的msbuild.exe路径,对于VS 2017,它将安装在C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ BuildTools \ MSBuild \ 15.0 \ Bin \ msbuild.exe。 - Simon Elms
3
在构建服务器上进行此操作的兼容方式(即命令行方式)是 choco install visualstudio2017-workload-webbuildtools - Paul Hicks
3
需要注意的是,"Web development build tools" package (Microsoft.VisualStudio.Workload.WebBuildTools) 可以通过在命令行中调用 vs_BuildTools.exe --add Microsoft.VisualStudio.Workload.WebBuildTools 来安装。添加 --passive 参数则无需用户干预。 - Wai Ha Lee
显示剩余3条评论

101

如果没有安装VS,则不支持构建和发布WAP应用程序。话虽如此,如果您真的不想安装VS,那么您需要复制%ProgramFiles32%\MSBuild\Microsoft\下的所有文件。

您还需要安装Web Deploy Tool。我想就是这些。


4
Sayed - 请参见下面 dansomething 的回答 - 你的答案正确吗?即使安装了VS2010 Shell Integrated包和.NET SDK,也无法正确安装Web应用程序项目支持? - Adam
@SayedIbrahimHashimi 如果您手动复制文件夹,是否需要向GAC注册DLL? - TheOptimusPrimus
那么 Microsoft.TextTemplating.targets 怎么办?我该怎么做才能将它们放在它们的文件夹中?C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0 - NoWar
@ClarkKent,抱歉我无法与TextTemplating文件交流。我对那些不熟悉。 - Sayed Ibrahim Hashimi
1
那么我必须在我的构建服务器上安装IDE才能部署吗?微软是个笑话,对吧? - wilmol
VS 2022已安装在构建代理上,但构建失败并显示错误消息:“错误MSB4226:未找到导入的项目“$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets”。@SayedIbrahimHashimi - undefined

82

更新:自VS2017以来,有一个名为Build Tools的工作负载可以完全消除这个问题。查看@SOReader答案

如果您不想在构建服务器上修改任何内容,并且仍然希望项目能够直接从源代码控制中构建,那么将所需的二进制文件放入源代码控制可能是个好主意。您需要修改项目文件中的import部分,使其如下所示:

<Import Project="$(SolutionDir)\BuildTargets\WebApplications\Microsoft.WebApplication.targets" />
<Import Condition="false" Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

第一行是实际从新位置导入的代码,该位置相对于解决方案目录而言。第二行是原始代码的关闭版本 (Condition="false"),使得 Visual Studio 仍然将您的项目视为有效的 Web 应用程序项目 (这是 VS 2010 SP1 自己做的技巧)。

别忘了将 C:\Program Files (x86)\Microsoft\VisualStudio\v10.0\WebApplications 文件夹复制到源代码控制下的 BuildTargets 文件夹中。


这个解决方案对我很有效,也是在我的情况下最好的选择。这是因为我无法访问构建服务器。我正在使用Atlassian的Elastic bamboo,它会启动一个新的服务器作为构建服务器。乍一看,这些AMI似乎不包括Web应用程序目标??这对我来说没有意义,但事实似乎是这样的。 - Cody Clark
1
这是一个不错的方法,但这个变更需要更改每个 csproj 文件。如果您将新项目添加到解决方案中,则会出现一些麻烦。当然,可以通过自定义项目模板来解决,但仍需小心处理。总之,这个答案让我找到了正确的方向。谢谢! - 100r

76

2
无法使用,因为我必须先打开解决方案,但由于错误而无法打开。 - NoWar
如果解决方案中有多个项目,您仍应该能够执行以下操作:1.打开解决方案-忽略Web项目未加载的情况;2.添加NuGet引用;3.在此之后采取提到的任一方法;您可以手动编辑项目文件或在TeamCity中覆盖env.VSToolsPath变量。 - Damon
1
这是一个官方发布的MS NuGet包,还是有人自己创建的? - Simon_Weaver
很棒的解决方案 - 适用于不同版本的VS。我需要编辑.csproj文件,但你的情况可能有所不同。 - Jonno
54
这不是微软官方发布的 NuGet 包。我知道这一点,因为是我自己创建的。 - mak
显示剩余3条评论

56

根据此处的帖子,您可以简单地下载Microsoft Visual Studio 2010 Shell(集成版)Redistributable Package即可安装targets。

这样就避免了在构建服务器上安装Visual Studio的需求。

我现在刚刚尝试过,并且可以验证它有效:

之前:

错误MSB4019: 未找到导入的项目“C:\ Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets” 确认声明中的路径是否正确,并且该文件在磁盘上是否存在。

安装后:

[成功进行构建]

这比在构建服务器上安装Visual Studio显然是一个更好的解决方案。


7
我认为这是最简单易行的解决方案。我正在使用VS 2013,我发现Visual Studio 2013 Shell(独立版)Redistributable是有效的(由于集成版需要依赖于独立版,因此无法安装)。 - Matt Miller
@MatthewSkelton - 构建服务器的含义是什么? - Zameer Ansari
2
@BountyMan - 一个构建服务器是承担或控制软件持续集成(CI)构建的服务器。例如:Jenkins,TeamCity,CruiseControl等。 - Matthew Skelton
3
很遗憾,在使用VS v14.0时,安装软件包的方法是通过Nuget进行的,但由于我的问题是构建服务器没有安装VS(仅有MSBuild),因此安装软件包几乎是不可能的。我花了几个小时在PowerShell和各种半成品的Nuget安装方案中摸索,最终决定将文件夹从我的电脑复制到服务器上。 - pasx
1
如果错误消息包含“v14”,您可以安装Visual Studio 2015隔离外壳,这对我有用 - http://www.visualstudioextensibility.com/downloads/vs-shells/(在“下载URL”下;有一个强制性调查,享受!) - Dunc
显示剩余2条评论

38

23
这是一个非常重要的答案,因为如果您是为客户设置构建服务器的独立开发人员,您不希望客户必须维护Visual Studio许可证才能构建他们的软件。 - thelsdj
我只需要VS2010 shell集成包和EntLib 5就能构建我的项目,不需要Team System。 - Robin Winslow
安装Team Explorer也可以解决问题 - 它包括了集成外壳包以及TFS支持,如果您需要的话。 - David Keaveny
1
VS 2010 Shell在该链接上已不再提供,“您正在寻找的资源已被删除、更改名称或暂时不可用。”。 - kristianp
VS 2010 Shell 安装程序仍可在以下网址找到:http://download.microsoft.com/download/D/7/0/D70CD265-3E18-41B0-AFC6-075AFA2DA631/VSIntShell.exe - khellang
显示剩余2条评论

26

在构建/持续集成服务器上,通过指定/p:VSToolsPath=''来完全关闭导入Microsoft.WebApplication.targets。这将基本上使得以下行的条件为false:

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


这是TeamCity的操作步骤:

在此输入图片描述


如果你要使用Visual Studio的“发布”机制,构建目标是必要的。这样做可以让编译过程继续进行并完成,但可能不完整。 - starlocke

26

通过NuGet添加依赖项并设置构建参数

目标:无需更改/安装构建代理

我采用了Lloyd的NuGet方法混合方法,该方法基于Andrik的提交二进制依赖项解决方案

原因是我希望能够添加新的构建代理,而无需预先配置它们的项目。

  1. 在安装了Visual Studio的电脑上,打开解决方案;忽略Web项目失败的信息。
  2. 在NuGet包管理器中添加MSBuild.Microsoft.VisualStudio.Web.targets,就像Lloyd所提到的那样。
  3. 这将解析二进制文件到[solution]\packages\MSBuild.Microsoft.VisualStudio.Web.targets.nn.n.n.n\tools\VSToolsPath\
    1. 您可以将它们复制到引用文件夹并提交,
    2. 或者直接使用它们所在的位置。我选择了后者,但是我以后必须处理路径中的版本号。

在版本7中,我执行了以下操作。这可能不是必要的,并且根据下面的评论肯定现在不需要。请参见下面的评论。

  1. 接下来,在TeamCity构建配置中,为env.VSToolsPath添加一个构建参数,并将其设置为VSToolsPath文件夹;我使用了..\packages\MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1\tools\VSToolsPath

9
如果您只需将项目文件中的<Import>元素替换为以下内容,则无需执行第4步骤:<Import Project="..\..\packages\MSBuild.Microsoft.VisualStudio.Web.targets.12.0.1\tools\VSToolsPath\WebApplications\Microsoft.WebApplication.targets" /> - knocte
这应该是被接受的答案...并且第4点应该被删除。 - Izzy
@Izzy 谢谢,你按照 knocte 的建议进行了注释吗?我已经好几年没用 TC 了,如果没记错的话是版本 7。 - Damon
@Damon 我正在使用Jenkins而不是TC,所以这可能是我不需要你最后一点的原因。 - Izzy

14
如果您将Visual Studio 2012迁移到2013,则使用编辑器打开*.csproj项目文件。
并检查'Project'标记的ToolsVersion元素。
  • 更改其值从4.0到12.0。

  • <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" ...
    
    翻译内容无效,需要提供完整的需翻译的文本。
    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="12.0" ...
    
    如果使用msbuild进行构建,只需指定VisualStudioVersion属性即可。

    msbuild /p:VisualStudioVersion=12.0

    解决方案来源


    4
    在TFS 2013构建定义中的MSBuild参数中添加/p:VisualStudioVersion=12.0(用于在Visual Studio 2013中创建的解决方案),这对我很有效。由于某种原因,它会在没有任何参数的情况下查找v11.0文件夹中的文件。 - Sacha K
    4
    这个解决方案对我也有效,我使用了这个命令:msbuild /p:Platform=x86 /p:VisualStudioVersion=12.0 - E.Meir

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接