442

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

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

4

23 回答 23

213

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

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

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

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

于 2011-03-17T19:36:12.710 回答
101

解决方案是在构建服务器代理上安装可再发行包。它可以通过多种方式完成,下面将介绍其中的 3 种。选择一个最适合你的。

使用带有 UI 的安装程序

这是原来的答案

现在,在 2017 年,您可以使用 MSBuildTools 安装 WebApplication redists。只需转到将下载 MSBuild 2017 工具的此页面Web development build tools,并在安装时单击以安装这些目标: 在此处输入图像描述

这将导致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
于 2017-06-22T15:55:44.003 回答
100

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

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

于 2010-10-22T01:06:18.493 回答
79

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

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

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

第一行是从相对于解决方案目录的新位置实际导入。Condition="false"第二个是原始行的关闭版本(

不要忘记复制源代码管理下的C:\Program Files (x86)\Microsoft\VisualStudio\v10.0\WebApplicationstoBuildTargets文件夹。

于 2012-10-19T13:20:01.173 回答
75

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

于 2013-08-12T09:50:21.983 回答
56

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

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

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

前:

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

安装后:

[正确构建]

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

于 2012-09-12T15:43:06.860 回答
38

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

于 2011-08-14T15:45:32.553 回答
26

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

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

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

原因是我希望能够添加新的构建代理,而不必使用诸如此类的项目预先配置它们。

  1. 在装有 Visual Studio 的机器上,打开解决方案;忽略 web 项目失败。
  2. 如 Lloyd 所述,在 NuGet 包管理器中添加MSBuild.Microsoft.VisualStudio.Web.targets 。
  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
于 2013-11-22T19:50:49.083 回答
23

在构建/CI 服务器上构建时,Microsoft.WebApplication.targets通过指定/p:VSToolsPath=''. 从本质上讲,这将使以下行的条件为假:

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


这就是它在 TeamCity 中的完成方式:

在此处输入图像描述

于 2016-03-03T19:43:56.300 回答
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

解决方案来源

于 2015-08-29T20:53:59.947 回答
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 ://alasaircrabtree.com/cannot-open-vs-2015-web-project-in-vs-2017/

于 2017-06-08T14:52:39.133 回答
8

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

在此处输入图像描述

于 2014-02-23T08:54:42.823 回答
6

我在MS connect上找到了这个:

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

所以,这是我目前唯一的选择。

于 2010-10-21T17:03:39.357 回答
4

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

希望这可以帮助某人。

于 2018-12-21T02:10:31.787 回答
2

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

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

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

但是,在这一行:

<Import Project="$(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) 扩展为有效路径,应用程序本身不需要更改,只需在构建服务器中(也许可以在每次构建时创建符号链接,以确保此步骤不会丢失并且“记录在案” ”)。

于 2014-07-31T19:20:12.830 回答
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

于 2014-11-07T12:36:03.183 回答
2

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

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

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

于 2015-10-27T10:14:13.810 回答
2

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

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

在此处输入图像描述

于 2018-03-08T20:59:51.953 回答
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:Configuration=Release /p:UseWPP_CopyWebApplication=true /p:PipelineDependsOnBuild=false

于 2019-11-30T17:53:32.670 回答
0

我通过在 docker 容器中运行构建来解决这个问题,特别是dotnet/framework/sdk。它包括 VS 构建工具。

于 2021-09-23T02:29:15.263 回答
0

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

在此处输入图像描述

于 2018-09-04T08:51:51.387 回答
0

我在 CI/CD 管道上构建 SQL Server 项目时遇到了这个问题。事实上,我在本地也有它,但我没有设法解决它。

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

  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 Server 2019。检查此答案以找出与您正在使用的版本的映射。

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

  6. 现在我们只需要确保在.sql构建 SDK 项目时文件在其内部。我通过 CI/CD 管道上的一个简单的 powershell 例程实现了这一点,它将文件从 SQL Server 项目复制到 SDK 项目:

Copy-Item -Path "Path.To.The.Database.Project\dbo\Tables\*" -Destination (New-item -Name "dbo\Tables" -Type Directory -Path "Path.To.The.DatabaseSDK.Project \")

PS:这些文件必须物理上位于 SDK 项目中,无论是在根目录中还是在某个文件夹中,因此指向.sdkSQL Server 项目中文件的链接将不起作用。从理论上讲,应该可以在预构建条件下复制这些文件,但由于一些模糊的原因,这对我不起作用。我还尝试将.sql文件放在 SDK 项目中并将它们链接到 SQL Server 项目,但这很容易破坏与 SQL Server 对象资源管理器的链接,所以我决定也放弃它。

于 2020-04-18T15:53:51.137 回答
0

创建一个新项目并复制设置可能会提供最好的指导。这就是我的样子

  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  </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" />
于 2021-09-29T15:20:07.157 回答