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

时间:2013-09-24 18:48:59

标签: tfs nuget azure-devops nuget-package-restore

我的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 个答案:

答案 0 :(得分:48)

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

  1. 确保您尝试构建的解决方案中的所有项目都包含最新的Microsoft.Bcl.Build包(只需在包管理器中更新)。
  2. 构建失败后,查看生成此错误的所有项目(在tfs构建日志摘要中)(“构建还原的NuGet包...”)
  3. 打开每个项目的.proj文件并注释掉以'Target Name =“EnsureBclBuildImported”'
  4. 开头的整个目标元素
  5. 签入并重试构建
  6. 升级后似乎不是所有的项目都会删除那些旧的构建代码块并导致问题(据我所知,在微软更改了他们的bcl构建过程之后不再需要它了。)

答案 1 :(得分:16)

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

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

  

改进

     

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

     

但是,Microsoft.Bcl.Build还为您的项目添加了一个目标   将在构建完成后运行。这个目标检查是否   当前构建已恢复的软件包,如果是这样,则使用   可操作的错误消息:

     

第二次构建将修复此错误。请注意这一点   错误只会在包丢失时出现,所以它不像你   总是要建两次。

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

  

此解决方案不涉及构建服务器/持续集成   (CI)场景。为了成功使用包恢复   构建服务器,您有两个选择:

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

所以,我想你的问题解决方案应该遵循以上两个步骤。

答案 2 :(得分:1)

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

  1. 将项目模式设置为Release and Rebuild All
  2. 将项目模式设置回Debug和Rebuild All
  3. 问题排序。
  4. 很奇怪,但为我工作,希望它有所帮助。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

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

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

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

答案 5 :(得分:0)

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

决议是将Microsoft BCL构建组件nuget包更新到最新版本(1.0.21),现在构建正常。

答案 6 :(得分:0)

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

  

<目标名称=" EnsureBclBuildImported" BeforeTargets =" BeforeBuild"   条件="' $(BclBuildImported)' ==''">

      <错误条件="!存在(' .. \ packages \ Microsoft.Bcl.Build.1.0.14 \ tools \ Microsoft.Bcl.Build.targets')"   Text ="该项目引用了缺少的NuGet包   这台电脑。启用NuGet Package Restore以下载它们。对于   更多信息,请参阅http://go.microsoft.com/fwlink/?LinkID=317567。"   HelpKeyword =" BCLBUILD2001" />

       <错误条件="存在(' .. \ packages \ Microsoft.Bcl.Build.1.0.14 \ tools \ Microsoft.Bcl.Build.targets&#39 ;)"   Text ="构建恢复了NuGet包。再次构建项目   在构建中包含这些包。有关更多信息,请参阅   http://go.microsoft.com/fwlink/?LinkID=317568&#34。   HelpKeyword =" BCLBUILD2002" />
  < /目标>

答案 7 :(得分:0)

我必须在构建脚本的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 :(得分:0)

问题故事:

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

解决方案:

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

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

对于所有面对的人

答案 9 :(得分:0)

正确的解决方案可以在这里找到: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>