Team Foundation Service 构建在 NuGet 包还原时失败

Posted

技术标签:

【中文标题】Team Foundation Service 构建在 NuGet 包还原时失败【英文标题】:Team Foundation Service build fails on NuGet package restore 【发布时间】:2013-09-30 03:27:59 【问题描述】:

我在构建 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 重新排队构建,然后......它再次发生。我已经用谷歌搜索了,但我似乎无法弄清楚问题所在。我可以在 Visual Studio 中很好地构建,并且该解决方案已配置为包还原。有什么想法吗?

提前致谢。

【问题讨论】:

【参考方案1】:

如果有人在 tfs 构建服务器上仍然遇到此问题,您需要执行以下操作:

    确保您尝试构建的解决方案中的所有项目都具有最新的 Microsoft.Bcl.Build 包(只需在包管理器中更新即可)。 构建失败后,查看所有生成此错误的项目(在 tfs 构建日志摘要中)(“构建已恢复 NuGet 包 ...”) 打开每个项目的 .proj 文件并注释掉以 'Target Name="EnsureBclBuildImported"' 开头的整个目标元素 签入并重试构建

似乎在升级之后,并非所有项目都删除了那些旧的构建代码块并且它导致了问题(据我了解,在微软更改了他们的 bcl 构建过程之后不再需要它)。

【讨论】:

在尝试解决问题几个小时后,这绝对解决了我的问题。 BCL 目标文件自推出以来一直令人头疼。这实际上不是一个解决方案,因为下次您更新软件包时,会重新添加虚假错误。我真的希望在微软管理这件事的人能得到线索并消除他们造成的混乱。它造成的问题多于解决的问题,并且随着时间的推移继续困扰着我们。这是一个缺乏dogfooding和监督的明显案例,它只适用于最简单的场景,它旨在解决一个想象中的问题。令人沮丧的垃圾!@#$ @ShaunWilson:我完全同意你的看法。这对我们来说也是一个巨大的痛苦。 第二个(第三个?)这个。使构建过程成为构建过程本身的动态依赖必然会失败。再加上 TFS 的 CI 构建的局限性,这是灾难的根源。【参考方案2】:

此问题的解决方案在错误消息本身的link 中指定。

这是由于该页面中指定的改进而发生的:

改进

我们更新了 Microsoft.Bcl.Build 以使用不同的方法。新的 版本将使用类似于 NuGet 的条件导入 自动导入功能。这将始终允许项目 在 Visual Studio 中加载。

不过,Microsoft.Bcl.Build 还会向您的项目添加一个目标,该目标 将在构建完成后运行。这个目标检查是否 当前构建恢复的包,如果是这样,构建失败 可操作的错误消息:

第二次构建将修复此错误。请注意,这 只有在缺少包裹时才会出现错误,所以它不像你 总是要构建两次。

然后它针对构建服务器/持续集成(CI)的情况指定如下:

此解决方案不涉及构建服务器/持续集成 (CI) 情景。为了在 构建服务器,你有两种选择:

    签入 .targets 文件。 在构建项目/解决方案之前显式运行 NuGet 包还原。

所以,我想为解决您的问题,应该遵循上述两个步骤。

【讨论】:

显然,即使我多次阅读该文档,我也完全错过了这一点。尴尬的。谢谢。 这是该问题的实际解决方案吗?问题是关于 TFS 构建而不是 VS 中的构建。如果有人可以提供帮助,我正在寻找 TFS 的解决方案。谢谢 @Jamie Hammond 答案明确提到了 CI 服务器的 2 个选项。 听起来这涵盖了 Nuget pre 2.7/ Post 2.7,当您使用最新的构建模板时,TFS 构建服务器应该能够自动执行此操作。 @George,它应该发布 2.7,但它没有。从我们的问题来看。必须将 .targets 文件签入 CI。【参考方案3】:

我在 Xamarin 项目中看到了类似的问题,并且执行以下步骤解决了我的问题;

    将项目模式设置为 Release and Rebuild All 将项目模式设置回“调试并全部重建” 问题已解决。

很奇怪,但对我有用,希望对你有帮助。

【讨论】:

哇...这刚刚奏效!逆天。尝试使用 asp.net 核心项目【参考方案4】:

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

nuget.org 上提供了有关如何执行此操作的详细信息。

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

【讨论】:

【参考方案5】:

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

解决方案是将 Microsoft BCL Build Components nuget 包更新到最新版本 (1.0.21),现在一切正常。

【讨论】:

【参考方案6】:

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

http://go.microsoft.com/fwlink/?LinkID=317567。” HelpKeyword="BCLBUILD2001" /> http://go.microsoft.com/fwlink/?LinkID=317568。” HelpKeyword="BCLBUILD2002" /> 目标>

【讨论】:

这只是隐藏了错误 - 但实际上并没有解决它?如果我忽略此错误,我如何知道我的项目是否会运行?【参考方案7】:

我必须在构建脚本的 clean 目标之前恢复包。我错误地认为在构建之前恢复包就足够了。

<?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>

【讨论】:

【参考方案8】:

TeamCity 而不是 TFS 也有同样的问题。

我们在构建之前明确地恢复包,但一些项目仍然在 CI 服务器上出错。

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

我们在恢复包后强制构建属性BclBuildImported = True。 csproj 文件中的恶意目标以未设置此属性为条件。

如果您可以在 TFS 中轻松设置此属性,则可能是一种更可靠的解决方法。

【讨论】:

【参考方案9】:

问题故事:

就我而言,我的一位队友使用了 VisualStudio 2017。在那里,我们通过使用 postsharp 等手编写版本,从项目文件中降级了一些 nuget 包。它已经在那里工作,他将更新的代码推送到 gitlab。 在我这边,我已经将 gitlab 中的代码汇集到我的本地存储库中,并且我已经使用 VisualStudio 2019 打开了它,我遇到了这个错误

解决方案:

1-我已经用 VisualStudio 2017 从我更新的本地存储库中打开了代码,并用它重建了它。

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

所有遇到的人

【讨论】:

【参考方案10】:

可以在这里找到正确的解决方案:https://docs.microsoft.com/ru-ru/nuget/consume-packages/package-restore-troubleshooting

只需添加到 NuGet.Config:

<!-- Package restore is enabled -->
<configuration>
    <packageRestore>
        <add key="enabled" value="True" />
        <add key="automatic" value="True" />
    </packageRestore>
</configuration>

【讨论】:

以上是关于Team Foundation Service 构建在 NuGet 包还原时失败的主要内容,如果未能解决你的问题,请参考以下文章

将 TF.exe 与 Team Foundation Service 一起使用?

如何从命令行连接到托管的 Team Foundation Service

Team Foundation Server 2018 - TFS_SERVICE_LEVEL不匹配

Team Foundation Server 构建失败

Team Foundation 无法从 Team Foundation Server 检索团队项目列表

使用 Team Foundation Server 中的 Team Foundation 版本控制将分支的最新版本合并到其根目录