在构建服务器上没有找到Microsoft.WebApplication.targets。你的解决办法是什么?

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

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

357017 次浏览

我在女士联系上找到了这个:

是的,你需要安装Visual Studio 2010在你的构建机器上进行构建 数据库项目。这样做确实 不需要额外的许可证 Visual Studio . < / p >

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

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

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

回答问题的标题(而不是你得到的输出的问题):

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

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

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

如上所述,除了Microsoft.WebApplication.targets的Microsoft Visual Studio 2010 Shell(集成)可重分发包和Microsoft.Data.Schema.SqlTasks.targets的Microsoft Visual Studio Team System 2008数据库版GDR R2之外,最新的Windows SDK应该可以减轻安装Visual Studio 2010的需求。然而,安装VS 2010可能实际上更少的整体下载和更少的工作。

基于这篇文章,你可以简单地下载Microsoft Visual Studio 2010 Shell(集成)可重分发包并安装目标。

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

我刚刚尝试了这一点,现在可以验证它的工作:

之前:

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

安装后:

(构建正确)

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

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\WebApplications复制到源代码控制下的BuildTargets文件夹。

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

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

目标:对构建代理没有必要的更改/安装

我对Lloyd的方法采取了混合方法,它基于提交二进制依赖解决方案由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. 或者就在它们所在的地方使用它们。我选择了这个,但是稍后我将不得不处理路径中的版本号。
    3. 李< / ol > < / >

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

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

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

enter image description here

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

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

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

但是,在这一行:

& lt;进口项目= " $ (MSBuildExtensionsPath) \微软\ VisualStudio \ v9.0 \ WebApplications \ Microsoft.WebApplication。目标" / >

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

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

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

通过这种方式,$(MSBuildExtensionsPath)扩展到一个有效的路径,应用程序本身不需要更改,只需要在构建服务器中更改(也许可以在每个构建中创建符号链接,以确保这一步不会丢失并被“记录”)。

我通过添加
修正了这个问题 /p:VCTargetsPath="C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V120" < br >
在< br > Build > Build a Visual Studio project or solution using MSBuild > Command Line Arguments < / p >

如果您将Visual Studio 2012迁移到2013,则打开*。Csproj项目文件编辑器。
检查'Project'标签的ToolsVersion元素。

将其值从4.0更改为12.0

  • < p >从

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" ...
    
    李< /引用> < / >
  • < p >

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="12.0" ...
    
    李< /引用> < / >

或者如果你用msbuild构建,那么只需指定VisualStudioVersion属性

msbuild / p: VisualStudioVersion = 12.0

解决方案来源

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

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

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

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

<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
< p > < br > 这是在TeamCity中的做法:

enter image description here

新版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" />
< p >参考链接: https://alastaircrabtree.com/cannot-open-vs-2015-web-project-in-vs-2017/ < / p >

解决方案是在构建服务器代理上安装可重新分发的包。它可以通过多种方式实现,下面将介绍其中3种方式。挑一个最适合你的。

使用UI安装程序

这是原来的答案

现在,在2017年,你可以用MSBuildTools重新安装WebApplication。只需转到这个页面,下载MSBuild 2017工具,在安装时单击Web development build tools来安装这些目标: enter image description here < / p >

默认情况下,这将导致在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
任何来这里参加Visual Studio 2017的人。我也有类似的问题,更新到15.6.1后无法编译项目。 我不得不安装MSBulild工具,但错误仍然存在。< / p > 我能够通过将v14.0文件夹从C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio复制到与v15.0相同的文件夹来解决这个问题,这解决了所有的错误。 现在我的文件夹结构如下所示,其中两个文件夹包含相同的内容。< / p >

enter image description here

如果你试图使用VSTS部署一个项目,那么问题可能与检查“托管的Windows容器”选项而不是“托管的VS2017”(或18等)有关:

enter image description here

如果你正在使用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"*

希望这能帮助到一些人。

  • 从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”中引用的任何版本
    • 在命令提示符中,运行以下命令进行检查
    • 李< / ul > < / >

    C: > msbuild“C: \ \ DotnetCi。/p:Configuration=Release /p:UseWPP_CopyWebApplication=true /p:PipelineDependsOnBuild=false

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

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

  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。检查answer以找出到您正在使用的版本的映射。

  5. 在构建时忽略SQL Server项目,这样它就不会在本地中断(它在Visual Studio上构建,但在VS Code上失败)。

  6. 现在,我们只需要确保构建SDK项目时.sql文件在其中。我在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\")

. dbo . project \"

PS:这些文件必须物理上在SDK项目中,要么在根文件夹中,要么在一些文件夹中,所以链接到SQL Server项目中的.sdk文件将不起作用。理论上,在预构建条件下复制这些文件应该是可能的,但由于某种模糊的原因,这对我来说并不适用。我还尝试在SDK项目上有.sql文件,并将它们链接到SQL Server项目,但这很容易破坏与SQL Server对象资源管理器的链接,所以我决定放弃这一点。

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

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

  <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" />

对我来说,它只是一个端口块。