簡體   English   中英

TFS無法恢復NuGet包

[英]TFS Can't Restore NuGet Package

我有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文件中。 同時確保兩個來源都“有效”。

<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配置文件文檔。

Matt的回答讓我走上正軌,但我們不使用內部飼料,所以我不得不做更多的挖掘。 這個答案至少適用於在Visual Studio 2015中創建並由TFS 2015構建的項目。

在Visual Studio中,打開NuGet包管理器設置(“工具”菜單>“NuGet包管理器”>“包管理器設置”)。 從左側的選項列表中選擇“包源”。

NuGet包源選項窗口的屏幕截圖

在解決方案的根目錄下創建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包並成功構建解決方案。

除了Matt的回答,我還想強調一下NuGet文檔中隱藏的內容:

NuGet配置文件按以下優先級順序處理(最接近文件夾nuget.exe從wins運行),例如假設解決方案目錄為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

這可以解釋特定情況下的一些奇怪的行為,其中還原是否取消已配置的Feed,具體取決於您是使用nuget 2.x還是3.x進行還原

編輯:我發現了可能無法檢測到包的另一個原因

我的軟件包“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調用,客戶端將首先發送完全按用戶指定的版本字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM