在生成服务器上找不到Microsoft.WebApplication.targets。您有什么解决方案?


410

尝试在构建服务器上构建项目会给我以下错误:

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 2015年


1
通过将<Import Project="..\Packages\MSBuild.Microsoft.VisualStudio.Web.targets.14.0.0.3\tools\VSToolsPath\WebApplications\Microsoft.WebApplication.targets" />路径替换$(VSToolsPath)为as进行修复:<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" />
GJ

Answers:


207

要回答问题的标题(而不是关于您得到的输出的问题):

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

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

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


11
在将v10.0替换为v11.0后,此版本适用于VS2012项目中的m2
DenNukem

2
我们不能只安装MSBuild工具而不是这个吗?microsoft.com/en-us/download/confirmation.aspx?id=40760
user20358 2014年

1
las,安装MSBuild工具不足以构建可在VisualStudio 2013中正常编译的项目
Michael Shaw

我必须将Web文件夹复制到v11.0以使其在安装VS2013之后能够正常工作,但该文件夹在此缺少。可以在VS中编译,但不能直接通过MSBUILD编译。
马丁·布劳恩

9
为VS2017工作。只需将C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ vXX.0 \ WebApplications复制到C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v15.0 \ WebApplications
jokab

95

如果未安装VS,则不支持构建和发布WAP。话虽如此,如果您真的不想安装VS,则需要将所有文件复制到%ProgramFiles32%\MSBuild\Microsoft\

您还将需要安装Web部署工具。我认为就是这样。


4
说了-参见下面来自某事的答案-您的答案正确吗?即使安装VS 2010 Shell Integrated软件包和.NET SDK,也将无法正确安装Web应用程序项目支持?
亚当

@SayedIbrahimHashimi如果执行手动文件夹复制,是否必须向GAC注册DLL?
TheOptimusPrimus

那Microsoft.TextTemplating.targets又如何呢?我要怎么做才能将它们放入文件夹?C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0
开发人员

@ClarkKent,对不起,我无法使用TextTemplating文件。我不熟悉这些。
易卜拉欣(Ibrahim Hashimi)说2013年

77

UPD:从VS2017开始,构建工具中的工作负载可以完全消除此问题。参见@SOReader答案

如果您不想在构建服务器上进行任何修改,并且仍然希望在源代码控制之外直接构建项目,则最好将所需的二进制文件置于源代码控制之下。您需要修改项目文件中的imports部分,如下所示:

<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\WebApplicationsBuildTargets文件夹复制到文件夹。


该解决方案对我有用,实际上是我的最佳选择。这是因为我无权访问构建服务器。我正在使用Atlassian的Elastic Bamboo,它启动了一个新服务器来充当构建服务器。乍一看,这些AMI是否包含Web应用程序目标?这对我来说没有任何意义,但是看起来就是这样。
科迪·克拉克

1
这是一个很好的方法,但是此更改要求更改每个csproj文件。如果将新项目添加到解决方案中,这将非常棘手。当然可以使用自定义项目模板来解决它,但是仍然..无论如何,这个答案为我指明了正确的方向。谢谢!
100r

75

现在,在2017年,您可以使用MSBuildTools安装WebApplication redist。只需转到将下载MSBuild 2017工具的页面,然后在安装时单击Web development build tools以同时安装以下目标: 在此处输入图片说明

这将导致C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications默认情况下安装缺少的库


2
我很惊讶,我五岁的时候把libs打包到源代码控制中,并且即使在今天,它的修改仍在获得投票,而这是开箱即用的正确答案。
Andriy K,

2
@AndriyK您的解决方案与我建议的解决方案有些不同,我理解为什么有人可能更喜欢您的解决方案……除非只是懒惰; D
SOReader

2
要使其更通用,对于Visual Studio的将来版本,您可以从visualstudio.microsoft.com/downloads下载最新的构建工具。向下 滚动页面,在底部附近展开“ Visual Studio工具”部分,然后下载“用于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。
西蒙·图西

2
兼容构建服务器(阅读:命令行)的方法是choco install visualstudio2017-workload-webbuildtools
Paul Hicks,

1
还要注意的是,“Web开发构建工具”套餐Microsoft.VisualStudio.Workload.WebBuildTools可以通过命令行调用安装vs_BuildTools.exe --add Microsoft.VisualStudio.Workload.WebBuildTools。添加--passive无需用户干预。
惠哈利

70

您还可以使用NuGet包MSBuild.Microsoft.VisualStudio.Web.targets,在Visual Studio项目中引用它们,然后按照Andriy K的建议更改引用。


2
无法使用,因为我必须先打开解决方案,但是由于错误,我无法使用。
开发人员

如果解决方案中有多个项目,您仍然应该能够1.打开解决方案-忽略Web项目未加载;2.添加nuget参考;3.采取随后提到的方法之一;您可以手动编辑项目文件,或在TeamCity中覆盖env.VSToolsPath变量。
达蒙

1
这是正式发布的MS nuget软件包,还是有人创建了它?
Simon_Weaver 2014年

很棒的解决方案-适用于VS的不同版本。我需要编辑.csproj文件YMMV
Jonno 2014年

39
这不是正式发布的Microsoft nuget软件包。我知道这是因为我创建了它。
2014年

54

根据此处的这篇文章,您可以简单地下载Microsoft Visual Studio 2010 Shell(集成)可再发行软件包,并安装目标。

这避免了在生成服务器上安装Visual Studio的需要。

我刚刚尝试了一下,可以验证它是否有效:

之前:

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

安装后:

[正确构建]

显然,这比在构建服务器上安装Visual Studio更好。


7
这是IMO最简单的解决方案。我正在使用VS 2013,但我发现Visual Studio 2013 Shell(独立)可再发行组件是行得通的(由于依赖于独立版本,因此无法安装集成版本)。
Matt Miller

@MatthewSkelton- 构建服务器是什么意思?
Mohammed Zameer

2
@BountyMan-构建服务器是承担或控制软件的持续集成(CI)构建的服务器。例如:詹金斯(Jenkins),TeamCity,CruiseControl等。–
马修·斯凯尔顿

3
不幸的是,对于VS v14.0,安装软件包的方法是通过nuget,但是由于我的问题是构建服务器没有安装VS(仅安装了MSBuild),因此几乎不可能安装软件包。在简单地将文件夹从我的PC复制到服务器之前,我花了数小时研究PowerShell和Nuget的各种半备份安装。
pasx 2016年

1
@pasx如果错误消息包含“ v14”,则可以改为安装Visual Studio 2015隔离外壳,为我工作-visualstudioextensibility.com/downloads/vs-shells(在“下载URL”下;有一项强制性调查,请享用!)
邓克(Dunc)'17年

38

最新的Windows SDK,因为除了上面提到的,“微软的Visual Studio 2010壳(集成)再发行组件包”的Microsoft.WebApplication.targets和“Microsoft Visual Studio团队系统2008年数据库版GDR R2”为Microsoft.Data.Schema .SqlTask​​s.targets应该减轻了安装Visual Studio 2010的需要。但是,安装VS 2010可能实际上下载起来较少,最终工作也较少。


仅供参考-如果您要在不安装完整的VS的构建服务器上构建Sql项目,那么此处提到的Team System 2008数据库版GDR R2安装程序很不走运。它的先决条件是Visual Studio Team System 2008数据库版SP1(英语)或Visual Studio Team System 2008套件SP1(英语)和Visual Studio 2008 Service Pack1。似乎您可以从.NET Framework中复制SqlServer.targets \ v4目录和TeamData msbuild定位\ program files \ msbuild \ microsoft \ visual studio \ v10.0 \中的文件,您的csprojs将会生成。
伊桑·布朗

绝对不是最漂亮的解决方案,但对我而言,时间是最重要的。简单地复制MSBuild目录只会给我带来更多问题。

21
这是一个非常重要的答案,因为如果您是一位独立开发人员,为客户端设置构建服务器,则您不希望客户端必须维护Visual Studio许可证即可构建其软件。
thelsdj 2012年

我只需要VS2010 Shell集成软件包和EntLib 5即可构建自己的软件。不需要团队系统。
罗宾·温斯洛

1
VS 2010 Shell在该链接上不再可用,“您正在寻找的资源已被删除,名称已更改或暂时不可用。”。
kristianp 2014年

22

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

目标:无需对构建代理进行任何更改/安装

在这里采用了LloydNuGet方法的混合方法,该方法基于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.VSToolsPathParamenter并将其设置到VSToolsPath文件夹;我用了..\packages\MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1\tools\VSToolsPath

8
只需执行以下步骤即可替换步骤4,如果您只是用以下内容替换项目文件中的<Import>元素:<Import Project="..\..\packages\MSBuild.Microsoft.VisualStudio.Web.targets.12.0.1\tools\VSToolsPath\WebApplications\Microsoft.WebApplication.targets" />
knocte 2014年

这应该是可接受的答案...,并且应该删除第4点。
Izzy

@Izzy谢谢,您是否按照knocte的指示进行了评论?几年来,我没有使用TC版本iirc。
戴蒙

@Damon我使用的是Jenkins,而不是TC,所以这也许就是为什么我不需要您的最后一点。
Izzy

21

在build / CI服务器上进行构建时,Microsoft.WebApplication.targets通过指定完全关闭导入/p:VSToolsPath=''。本质上,这将使以下行的条件为假:

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


这是在TeamCity中完成的方式:

在此处输入图片说明


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

14

如果将Visual Studio 2012迁移到2013,请使用edior打开* .csproj项目文件。
并检查“项目”标签的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
将/p:VisualStudioVersion=12.0添加到TFS 2013构建定义中的MSBuild参数(对于在Visual Studio 2013中创建的解决方案)对我有用。由于某种原因,它将在v11.0文件夹中查找没有任何参数的文件。
2015年

3
此解决方案对我有效,我使用了以下命令:msbuild /p:Platform=x86 /p:VisualStudioVersion=12.0
E.Meir

9

似乎新版本的msbuild并未附带Microsoft.WebApplication.targets。要解决此问题,您需要这样更新csproj文件:

1)编辑Web应用程序csproj(右键单击)。在底部的csproj中找到有关构建工具的部分。它应该看起来像这样。

<PropertyGroup>  
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
</PropertyGroup>  
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />  
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />  
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />  

2)您需要在VisualStudioVersion标记下方添加一条VSToolsPath行,因此如下所示

<PropertyGroup>  
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  <!--Add the below line to fix the project loading in VS 2017 -->
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  <!--End -->
</PropertyGroup>  
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />  
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />  
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />  

参考链接:https : //alastaircrabtree.com/cannot-open-vs-2015-web-project-in-vs-2017/


8

这就是您所需要的。只有103MB。不要安装所有内容

在此处输入图片说明


我如何在安装任何内容的情况下在该表格上打勾?
基督教徒

5

我在MS connect上找到了这个:

是的,您需要在生成计算机上安装Visual Studio 2010才能生成数据库项目。这样做不需要Visual Studio的额外许可。

因此,这是我目前唯一的选择。


2
链接似乎已断开。
2015年

2

我的解决方案是这里的几个答案的混合。

我检查了构建服务器,并且已经安装了Windows7 / NET4.0 SDK,所以确实找到了路径:

C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v9.0 \ WebApplications \ Microsoft.WebApplication.targets`

但是,在这一行:

<导入项目=“ $(MSBuildExtensionsPath)\ Microsoft \ VisualStudio \ v9.0 \ WebApplications \ Microsoft.WebApplication.targets” />

$(MSBuildExtensionsPath)扩展为C:\ Program Files \ MSBuild没有路径的。

因此,我要做的就是使用以下命令创建符号链接:

mklink / J“ C:\ Program Files \ MSBuild \ Microsoft \ VisualStudio”“ C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio”

这样,$(MSBuildExtensionsPath)可以扩展到有效路径,而无需在应用程序本身中进行任何更改,只需在构建服务器中即可(也许可以在每个构建中创建符号链接,以确保这一步不会丢失并记录在文档中) ”)。


2

我通过添加
/p:VCTargetsPath="C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V120"


Build > Build a Visual Studio project or solution using MSBuild > Command Line Arguments



2

任何人都来这里参加Visual Studio2017。我遇到了类似的问题,并且在更新到15.6.1之后无法编译该项目。我必须安装MSBulild工具,但仍然存在错误。

通过将v14.0文件夹从复制C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio到相同的文件夹中v15.0,我能够解决此问题,并解决了所有错误。因此,现在我的文件夹结构如下所示,其中两个文件夹都包含相同的内容。

在此处输入图片说明


2

如果您使用的是MSBuild(例如构建服务器),那么对我有用的是:

更改以下内容:

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

至:

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

我的Msbuild命令是: *"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" solution.sln /p:Configuration=Debug /p:Platform="Any CPU"*

希望这对某人有帮助。


值得一提的是,应该对有问题的.csproj,vbproj文件进行更改。
科林Q

0

如果您尝试使用VSTS部署项目,则问题可能与检查“托管Windows容器”选项而不是“托管VS2017”(或18等)有关:

在此处输入图片说明


0
  • 从Microsoft安装MSBuild工具后,请在环境变量中定义MSBuild路径,以便可以从任何路径运行它。
  • 在任何记事本编辑器(例如notepad ++)中编辑.csproj文件,并在
  • 检查以下元素,->
    • 确保仅使用一次导入,选择任何可行的方法。
    • 确保驱动器上存在以下文件夹“ C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v14.0”或MSBuild目标在“ C:\ Program Files(x86)”引用的任何版本\ MSBuild \ Microsoft \ VisualStudio \ v14.0 \ WebApplications \ Microsoft.WebApplication.targets“
    • 在命令提示符下,运行以下命令,以检查

C:> msbuild“ C:\\ DotnetCi.sln” / p:配置=发布/ p:UseWPP_CopyWebApplication = true / p:PipelineDependsOnBuild = false


0

我遇到了在CI / CD管道上构建SQL Server项目的问题。实际上,我也在本地使用它,但是我没有设法解决它。

对我来说有效的方法是使用MSBuild SDK,该软件能够.dacpac通过一组SQL脚本生成SQL Server数据层应用程序包(),这意味着创建一个新项目。但是我想保留SQL Server项目,以便可以通过Visual Studio上的SQL Server Object Explorer将其链接到实时数据库。我采取了以下步骤来启动并运行它:

  1. 将我的SQL Server项目与 .sql数据库脚本。
  2. 根据以上链接中的指南,创建了一个.NET Standard 2.0类库项目,确保目标框架是.NET Standard 2.0。
  3. 设置内容.csproj如下:

    <?xml version="1.0" encoding="utf-8"?>
    <Project Sdk="MSBuild.Sdk.SqlProj/1.0.0">
      <PropertyGroup>
        <SqlServerVersion>Sql140</SqlServerVersion>
        <TargetFramework>netstandard2.0</TargetFramework>
      </PropertyGroup>
    </Project>
  4. 我选择Sql140作为SQL Server版本,因为我正在使用SQL Server 2019.检查此答案以找出到您使用的版本的映射。

  5. 忽略生成时的SQL Server项目,以便它在本地停止中断(它确实在Visual Studio上生成,但在VS Code上失败)。

  6. 现在,我们只需要确保.sql文件在构建时就在SDK项目中即可。我通过在CI / CD管道上使用一个简单的powershell例程实现了该任务,该例程会将文件从SQL Server项目复制到SDK项目:

复制项-路径“ Path.To.The.Database.Project \ dbo \ Tables \ *”-目的地(新项目-名称“ dbo \ Tables”-类型目录-路径“ Path.To.The.DatabaseSDK.Project \“)

PS:文件必须物理上位于SDK项目中,无论是在根目录还是在某些文件夹中,因此无法链接到.sdkSQL Server项目中的文件。从理论上讲,应该可以使用预构建条件来复制这些文件,但是出于某种模糊的原因,这对我不起作用。我也尝试将.sql文件保存在SDK项目中并将其链接到SQL Server项目,但这很容易破坏与SQL Server Object Explorer的链接,因此我决定也删除它。

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.