在构建服务器上找不到Microsoft.WebApplication.targets。你的解决方案是什么?

时间:2010-10-20 18:05:00

标签: msbuild .net-4.0 build-server targets dbproj

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

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,解决了这个问题。但现在我从头开始设置一个新的服务器,我想知道是否有更好的解决方案来解决这个问题。

21 个答案:

答案 0 :(得分:202)

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

将以下文件夹从您的开发计算机复制到您的构建服务器,如果它只是Web应用程序,则会修复此问题

  

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

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

答案 1 :(得分:94)

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

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

答案 2 :(得分:71)

UPD:从VS2017开始,Build Tools中的工作负载完全消除了这个问题。请参阅@SOReader answer

如果您不想在构建服务器上修改任何内容,并且仍希望项目能够直接从源代码控制中构建,那么将所需的二进制文件置于源代码管理之下可能是个好主意。您需要修改项目文件中的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\WebApplications复制到BuildTargets文件夹。

答案 3 :(得分:65)

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

答案 4 :(得分:56)

目前,在2017年,您可以使用MSBuildTools安装WebApplication redists。只需转到下载MSBuild 2017工具的this page,安装时点击Web development build tools即可安装这些目标: enter image description here

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

答案 5 :(得分:55)

根据this post here,您只需下载Microsoft Visual Studio 2010 Shell (Integrated) Redistributable Package即可安装目标。

这样就无需在构建服务器上安装Visual Studio。

我刚刚尝试了这个,并且可以验证它是否有效:

在:

  

错误MSB4019:导入的项目“C:\ Program Files   (86)\的MSBuild \微软\ VisualStudio的\ V10.0 \ web应用\ Microsoft.WebApplication.targets”   没找到。确认声明中的路径是   正确,并且该文件存在于磁盘上。

安装后:

[构建正确]

这显然比在构建服务器上安装Visual Studio要好得多。

答案 6 :(得分:38)

如上所述,除Microsoft.WebApplication.targets的"Microsoft Visual Studio 2010 Shell (Integrated) Redistributable Package"和Microsoft.Data.Schema.SqlTask​​s.targets的"Microsoft Visual Studio Team System 2008 Database Edition GDR R2"之外,最新的Windows SDK应该可以减轻安装Visual的需要但是,安装VS 2010实际上可能实际上不那么容易下载并且最终会减少工作量。

答案 7 :(得分:20)

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

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


这就是它在TeamCity中的表现:

enter image description here

答案 8 :(得分:15)

通过NuGet&amp;添加依赖项设置构建参数

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

我采用了NuGet approach by Lloyd here的混合方法,该方法基于committing binary dependencies solution by 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. 您可以将这些复制到参考文件夹&amp;提交,
    2. 或者只是在他们所在的地方使用它们。我选择了这个,但是我将不得不在以后的路径中处理版本号。
  4. 在版本7中,我执行了以下操作。这可能没有必要,现在绝对不需要根据评论。请参阅以下评论。

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

答案 9 :(得分:13)

如果将Visual Studio 2012迁移到2013,请使用edior打开* .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

Solution Source

答案 10 :(得分:8)

这就是你所需要的。只有103MB。不要安装所有东西

enter image description here

答案 11 :(得分:8)

似乎新版本的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/

答案 12 :(得分:5)

我在MS connect上找到了这个:

  

是的,您需要安装Visual Studio   2010年在你的构建机器上构建   数据库项目。这样做   不需要额外的许可证   Visual Studio。

所以,这是我现在唯一的选择。

答案 13 :(得分: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

答案 14 :(得分:2)

有人来到Visual Studio 2017.我有类似的问题,在更新到15.6.1后无法编译项目。 我不得不安装MSBulild工具,但仍然存在错误。

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

enter image description here

答案 15 :(得分:2)

我尝试了很多解决方案,但最后这个答案对我有用:https://stackoverflow.com/a/19826448/431522

它基本上需要从MSBuild目录而不是Visual Studio目录中调用MSBuild。

我还将MSBuild目录添加到我的路径中,以使脚本更容易编码。

答案 16 :(得分:2)

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

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

  

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

然而,在这一行:

  

&lt; Import Project =“$(MSBuildExtensionsPath)\ Microsoft \ VisualStudio \ v9.0 \ WebApplications \ Microsoft.WebApplication.targets”/&gt;

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

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

  

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

这样$(MSBuildExtensionsPath)扩展为有效路径,并且应用程序本身不需要进行任何更改,仅在构建服务器中(可能每个构建都可以创建符号链接,以确保此步骤不会丢失,是“记录”)。

答案 17 :(得分:0)

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

enter image description here

答案 18 :(得分:0)

如果您使用的是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"*

希望这对某人有帮助。

答案 19 :(得分: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

答案 20 :(得分:0)

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

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

  1. 使用.sql数据库脚本保留我的SQL Server项目。
  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 Server2019。请选中此answer来查找到您正在使用的版本的映射。

  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项目中的根目录或某个文件夹中,因此无法链接到SQL Server项目中的.sdk文件。从理论上讲,应该可以使用预构建条件来复制这些文件,但是出于某种模糊的原因,这对我不起作用。我还尝试将.sql文件放在SDK项目中并将其链接到SQL Server项目,但这很容易断开与SQL Server Object Explorer的链接,因此我决定也删除它。 >