团队基础服务构建失败,原因是NuGet包还原失败。

36

我在使用Team Foundation Service进行构建时遇到了一个奇怪的问题。我将其排队,开始时它运行得很好,但是后来出现了以下错误:

C:\a\src\Platform\Prod\Platform.Web\Platform.Web.csproj (436): The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568.

于是,我按照消息/URL重新排队构建,但问题又出现了。我已经在 Google 上搜索过了,但似乎无法弄清楚问题所在。我可以在 Visual Studio 中轻松构建,并且解决方案已配置为包恢复。有什么想法吗?

提前感谢。

10个回答

49
如果仍然在 tfs 构建服务器上遇到此问题,请执行以下步骤:
  1. 确保要构建的解决方案中的所有项目都安装了最新的 Microsoft.Bcl.Build 包(只需在软件包管理器中更新即可)。
  2. 在构建失败后,查看生成此错误的所有项目(在 tfs 构建日志摘要中)。
  3. 打开这些项目的每个 .proj 文件,并注释掉以 'Target Name="EnsureBclBuildImported"' 开头的整个目标元素。
  4. 检入并重试构建。
似乎在升级后,没有删除所有项目的旧的构建代码块,导致出现问题(据我理解,在微软更改其 bcl 构建过程后,不再需要这些代码块)。

这绝对解决了我的问题,在尝试几个小时来排除这个问题后。 - reallyJim
22
自从引入BCL目标文件以来,它一直是个头疼的问题。这实际上并不是解决方案,因为下次更新包时会重新添加虚假错误。我真的希望微软负责此事的人能够意识到问题所在并撤销他们所创建的混乱局面。它引起的问题比解决的问题还要多,而且随着时间的推移,问题仍在困扰我们。这是一个明显的狗食问题和监管不力案例,它只能在最简单的场景下工作,并旨在解决一个虚构的问题。令人沮丧的垃圾!@#$ - Shaun Wilson
2
@ShaunWilson:我完全同意你的看法。这对我们来说也是一个巨大的痛苦。 - Dave New
1
我也赞同这个观点。将构建过程作为构建过程本身的动态依赖是注定会失败的。再加上 TFS 的 CI 构建的限制,这会导致灾难。 - Jostein Kjønigsen

17
该问题的解决方案在错误信息本身中指定的链接中。这是由于该页面中指定的改进导致的: 改进 我们已更新Microsoft.Bcl.Build以使用不同的方法。新版本将使用类似于NuGet自动导入功能的条件导入。这将始终允许在Visual Studio中加载项目。
但是,Microsoft.Bcl.Build还会向您的项目添加一个目标,在构建完成后运行。此目标检查当前生成是否恢复了包,如果是,则使用可操作的错误消息失败生成:
第二次构建将修复此错误。请注意,仅当缺少软件包时,此错误才会出现,因此并非总是需要构建两次。
然后针对构建服务器/持续集成(CI)的情况进行如下说明:
此解决方案不适用于构建服务器/持续集成(CI)场景。要在构建服务器上成功使用软件包还原,您有两个选择:
1. 检入.targets文件。 2. 显式运行NuGet软件包还原以在构建项目/解决方案之前进行构建。
因此,我认为应遵循上述两个步骤来解决您的问题。

3
看来我在多次阅读文件时完全没有注意到这一点,有些尴尬。谢谢。 - benjy
3
这是否是针对问题的实际解决方案?该问题涉及TFS构建而非VS中的构建。如果有人能帮忙提供TFS的解决方案,将不胜感激。谢谢。 - Jamie Hammond
3
答案明确提到了 CI 服务器的两个选项。 - John H
@CraigBrett 确保你正在使用来自2013年的最新构建模板。如果你从TFS 2012导入了你的构建模板,你将无法使用新潮的Nuget包还原方式。 - George Stocker
我的问题是如何实现“步骤2”... 应该在每个.csproj中添加一种nuget定义/命令吗? - Jaider
显示剩余2条评论

7

我在Xamarin项目中遇到了类似的问题,通过以下步骤解决了我的问题:

  1. 将项目模式设置为“发布”并重新构建全部
  2. 将项目模式设置回“调试”并重新构建全部
  3. 问题解决。

虽然很奇怪,但对我有效,希望能帮到你。


1
哇...这个刚刚成功了!难以置信。我试过asp.net core项目。 - mai

0

在记事本或任何其他编辑器中打开有问题的csproj文件。 检查csproj文件中是否有目标EnsureBclBuildImported。如果有,则注释掉该目标内部的第二个错误条件,该条件指示构建即使包可用也会失败(它就像无论包是否可用都会使构建失败!)。


<Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="此项目引用了在此计算机上缺失的 NuGet 包。启用 NuGet 包恢复以下载它们。有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=317567。" HelpKeyword="BCLBUILD2001" />

<Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="生成还原了 NuGet 包。重新生成项目,以便在生成中包含这些包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=317568。" HelpKeyword="BCLBUILD2002" />
</Target>

这只是隐藏了错误-但它并没有真正解决它?如果我忽略此错误,该项目将是否运行,我如何知道呢? - AlbatrossCafe

0

我在一个Web API项目中遇到了这个问题,但我们使用NAnt。

解决方法是将Microsoft BCL Build Components nuget包更新到最新版本(1.0.21),现在一切都可以正常构建了。


0

刚刚在TeamCity上遇到了与TFS相同的问题。

我们在构建之前明确地还原了包,但是一些项目仍然在CI服务器上出现错误。

我们能够在不篡改csproj文件的情况下解决它。

在还原包后,我们强制设置了构建属性BclBuildImported = True。csproj文件中的流氓目标是有条件的,取决于此属性是否被设置。

如果您可以在TFS中轻松设置此属性,则可能会有更可靠的方法来解决它。


0

问题描述:

在我的情况下,我的一个队友使用了VisualStudio 2017。我们通过手动编写版本号(如postsharp等)从项目文件中降级了一些nuget包。这在他那里已经成功了,他将更新的代码推送到了gitlab上。 在我的一侧,我从gitlab中拉取了代码到我的本地仓库,并使用VisualStudio 2019打开它,但是出现了错误。

解决方案:

1- 我从我的更新本地仓库中使用VisualStudio 2017打开代码并重新构建它。

2- 我关闭了VisualStudio 2017并使用VisualStudio 2019重新打开。这次重建成功了。

对于所有遇到此问题的人们。


0

必须将所需的 TFSBuild 目标文件包含在源代码控制中,或者在尝试构建解决方案之前必须还原 NuGet 包。

如何执行此操作的详细信息可在 nuget.org 上找到。

基本上涉及创建一个新的构建项目文件,该文件首先还原包,然后构建您的解决方案。


0

0

在我的构建脚本的清理目标之前,我不得不恢复软件包。我错误地认为在构建之前恢复软件包就足够了。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets='GatherBinaries' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>

    <Target Name='RestorePackages'>
        <Exec Command='tools\NuGet.exe Restore "Web.sln"'/>
    </Target>

    <!--
        must call RestorePackages prior to clean to avoid error the following error
        "The build restored NuGet packages. Build the project again to include these packages in the build."
        -->
    <Target Name='Clean' DependsOnTargets='RestorePackages'>
        <MSBuild Projects='Web.sln' Targets='Clean' Properties='Configuration=Release'/>
    </Target>

    <Target Name='Build' DependsOnTargets='Clean;RestorePackages'>
        <MSBuild Projects='Web.sln' Targets='Build' Properties='Configuration=Release'/>
    </Target>

</Project>

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