【问题标题】:TFS Can't Restore NuGet PackageTFS 无法还原 NuGet 包
【发布时间】:2023-03-04 00:47:01
【问题描述】:

我让 TFS 进行了一些持续集成构建。今天,它打破了一种解决方案。似乎找不到 AutoMapper。所有其他的包都可以找到就好了。

几个相关点:

  • 没有一个包在源代码控制中,我们让 TFS 恢复它们。
  • 我们有一个内部 NuGet 提要,但它在其他解决方案中似乎不是问题,在这个解决方案中,我们仍然需要恢复实体框架 - 只是不是 AutoMapper。
  • 我尝试删除并重新添加 NuGet 包。不走运。
  • 如果我使用远程桌面连接到构建服务器并在 Visual Studio 中打开项目,它会恢复包并正常构建。
  • 我可以通过执行D:\"Program Files"\"Microsoft Team Foundation Server 12.0"\Tools\Nuget.exe restore 后跟msbuild MySolutoin.sln 手动构建
  • 我们的 TFS 服务器安装在 D:\ 驱动器上。

这是来自 TFS 日志:

D:\Program Files\Microsoft Team Foundation Server 12.0\Tools\nuget.exe restore "C:\Builds\1\MyCompany Web\FclQuoteWcfService\src\FclQuoteWcfService.sln" -NonInteractive
Installing 'EntityFramework 6.1.3'.
Installing 'InternalPackage 1.0'.
Successfully installed 'InternalPackage 1.0'.
Successfully installed 'EntityFramework 6.1.3'.
Unable to find version '3.3.1' of package 'AutoMapper'.
C:\Program Files (x86)\MSBuild\12.0\bin\amd64\MSBuild.exe /nologo /noconsolelogger "C:\Builds\1\MyCompany Web\FclQuoteWcfService\src\FclQuoteWcfService.sln" /nr:False /fl /flp:"logfile=C:\Builds\1\MyCompany Web\FclQuoteWcfService\src\FclQuoteWcfService.log;encoding=Unicode;verbosity=normal" /p:SkipInvalidConfigurations=true /m /p:OutDir="C:\Builds\1\MyCompany Web\FclQuoteWcfService\bin\\" /p:VCBuildOverride="C:\Builds\1\MyCompany Web\FclQuoteWcfService\src\FclQuoteWcfService.sln.vsprops" /dl:WorkflowCentralLogger,"D:\Program Files\Microsoft Team Foundation Server 12.0\Tools\Microsoft.TeamFoundation.Build.Server.Logger.dll";"Verbosity=Normal;BuildUri=vstfs:///Build/Build/230;IgnoreDuplicateProjects=False;InformationNodeId=12;TargetsNotLogged=GetNativeManifest,GetCopyToOutputDirectoryItems,GetTargetPath;TFSUrl=http://ctidev2k8:8080/tfs/MyCompany;"*WorkflowForwardingLogger,"D:\Program Files\Microsoft Team Foundation Server 12.0\Tools\Microsoft.TeamFoundation.Build.Server.Logger.dll";"Verbosity=Normal;" /p:BuildId="9aa9f8af-c9b9-4d0a-ba06-7cc959231d8e,vstfs:///Build/Build/230" /p:BuildLabel="FclQuoteWcfService_20150330.2" /p:BuildTimestamp="Mon, 30 Mar 2015 20:40:07 GMT" /p:BuildSourceVersion="LFclQuoteWcfService_20150330.2@$/MyCompany Web" /p:BuildDefinition="FclQuoteWcfService"
 Exception Message: MSBuild error 1 has ended this build. You can find more specific information about the cause of this error in above messages. (type BuildProcessTerminateException) Exception Stack Trace: at System.Activities.Statements.Throw.Execute(CodeActivityContext context) at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)

【问题讨论】:

  • 您是否仅从构建服务器上的内部 NuGet 源进行恢复?或者您是否也允许从 nuget.org 恢复?如果不是,请检查该包是否确实在您的内部提要中。此外,在手动运行构建时,您可能会以具有不同访问权限(以及不同的 nuget.config 全局文件,以及不同的 nuget 存储库)的不同用户身份运行。

标签: tfs nuget tfsbuild nuget-package-restore


【解决方案1】:

我也见过这个。一旦 NuGet 包还原切换到内部提要,它似乎就会被触发。一旦完成,就不会切换回官方的 nuget.org 提要,而是继续在内部提要中查找包。

确保将两个包源都添加到您的 NuGet.config 文件中。还要确保两个来源都是“活动的”。

<configuration>
    <packageSources>
        <add key="nuget.org"
             value="https://www.nuget.org/api/v2/" />
        <add key="example.com"
             value="http://example.com/feed/nuget/" />
    </packageSources>
    <activePackageSource>
        <add key="All"
             value="(Aggregate source)" />
    </activePackageSource>
</configuration>

请参阅NuGet configuration file 文档。

【讨论】:

    【解决方案2】:

    Matt 的回答让我走上了正轨,但我们不使用内部提要,所以我不得不做更多的挖掘工作。这个答案至少适用于在 Visual Studio 2015 中创建并由 TFS 2015 构建的项目。

    在 Visual Studio 中,打开 NuGet 包管理器设置(工具菜单 > NuGet 包管理器 > 包管理器设置)。从左侧的选项列表中选择“包源”。

    在解决方案的根目录下创建nuget.config 文件。这应该与“.sln”解决方案文件的文件夹位置相同。将以下内容复制到配置文件中:

    <configuration>
        <packageSources>
    
        </packageSources>
        <activePackageSource>
            <add key="All"
                 value="(Aggregate source)" />
        </activePackageSource>
    </configuration>
    

    &lt;packageSources&gt; 标记内,为“包源”选项窗口中列出的每个源创建一个&lt;add key="" value="" /&gt; 条目。键是 URL 上面显示的源名称,值是 URL 本身。包括在“可用的包源”和“机器范围的包源”中列出的那些。我没有为本地文件系统创建一个条目,因为它没有在这个解决方案中使用。根据上面的截图,完整的配置文件现在包含以下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <packageSources>
            <add key="nuget.org"
                 value="https://api.nuget.org/v3/index.json" />
            <add key="Microsoft and .NET"
                 value="https://www.nuget.org/api/v2/curated-feeds/microsoftdotnet/" />
        </packageSources>
        <activePackageSource>
            <add key="All"
                 value="(Aggregate source)" />
        </activePackageSource>
    </configuration>
    

    nuget.config 文件提交到源代码管理后,TFS 能够下载所有必要的 NuGet 包并成功构建解决方案。

    【讨论】:

      【解决方案3】:

      除了马特的回答,我想强调一下 NuGet 文档中以下隐藏得很好的东西:

      NuGet 配置文件按以下优先顺序处理 (最接近从wins运行的文件夹nuget.exe),例如假设 解决方案目录为c:\a\b\c:

      • c:\a\b\c\.nuget\nuget.config - 此文件仅用于解决方案 级别包,并且在 nuget 3.0 - 3.4 中不受支持
      • c:\a\b\c\nuget.config
      • c:\a\b\nuget.config
      • c:\a\nuget.config
      • c:\nuget.config
      • 用户特定的配置文件, %AppData%\NuGet\nuget.config
      • 或用户通过选项指定的文件 -ConfigFile

      这可以解释特定场景中的一些奇怪行为,即还原是否会拾取配置的提要,具体取决于您是使用 nuget 2.x 还是 3.x 进行还原

      编辑:我找到了yet another reason why packages might not be detected

      我有包“A”,版本为1.1.1.0

      3.4 之前这个命令运行良好:

      nuget install A -version 1.1.1.0

      使用 NuGet 3.4 RC,我得到:

      An error occurred while retrieving package metadata for 'A.1.1.1' from source 'N'. An error occurred while retrieving package metadata for 'A.1.1.1' from source 'N'. Data at the root level is invalid. Line 1, position 1.

      ...

      客户端将 1.1、1.1.0、1.01.0 和 1.1.0.0 视为同一版本 使用 SemVer 规则。 非标准化版本的特殊原因 过去的情况是因为对于 v2 http 调用,客户端会首先 完全按照用户指定的方式发送版本字符串

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-04
        • 2014-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多