TFS 无法恢复 NuGet 包

9
我已经使用TFS进行了一些持续集成构建。今天,其中一个解决方案出现了问题。似乎找不到AutoMapper。其他所有包都可以找到。
一些相关的要点:
- 没有一个包在源代码控制中,我们让TFS恢复它们。 - 我们有一个内部NuGet源,但在其他解决方案中似乎没有问题,在这个解决方案中我们仍然可以获取实体框架来恢复,只是不能获取AutoMapper。 - 我尝试删除和重新添加NuGet包,但没有成功。 - 如果我使用远程桌面连接到构建服务器并在那里打开项目,在那里它会恢复包并成功构建。 - 我可以通过执行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 feed 进行还原吗?或者你也允许从 nuget.org 进行还原吗?如果不是,那么请检查包是否实际存在于你的内部 feed 中。此外,当手动运行构建时,你可能会以不同的用户身份运行,该用户具有不同的访问权限(以及不同的 nuget.config 全局文件和不同的 nuget 仓库)。 - Petrik
3个回答

11

我也看到过这个问题。似乎一旦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配置文件的文档。


1
Matt的回答让我找到了正确的方向,但我们不使用内部源,所以我需要再做一些挖掘。至少,在使用Visual Studio 2015创建并由TFS 2015构建的项目中,此答案有效。
在Visual Studio中,打开NuGet包管理器设置(工具菜单> NuGet包管理器> 包管理器设置)。从左侧的选项列表中选择“包源”。

Screenshot of the NuGet Packages Sources options window

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

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

<packageSources>标签中,为“Package Sources”选项窗口中列出的每个源创建一个<add key="" value="" />条目。键是源的名称,如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 包并成功构建解决方案。


0
除了Matt的回答之外,我想强调一下NuGet文档中隐藏的一些重要内容:
NuGet配置文件按照以下优先顺序处理(离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进行还原。

编辑:我发现了另一个包未被检测到的原因

我有一个版本为1.1.1.0的“A”软件包。

在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.

...

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


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