某古老專案建置時,.nuget\nuget.exe 出現以下錯誤訊息:

用戶端與伺服器無法溝通,因為它們沒有公用的演算法。
The client and server cannot communicate, because they do not possess a common algorithm.

依直覺是 TLS 1.2 問題,爬文查到訊息不同(The underlying connection was closed: An unexpected error occurred on a send)的類似案例,使出處理 ASP.NET 3.5 TLS 1.2 問題的大絕 - 設 Registry 強制使用 TLS 1.2,不用重開機問題便消失無蹤。

不過,注意到專案包含 .nuget 目錄及 nuget.exe,版本要老到什麼程度才不支援 TLS 1.2 呢? 記得這是很早期的 NuGet 做法,不知何時起,Visual Studio 與 MSBuild 已不需要 NuGet.exe,更不用每個專案自己裝一份。

查到微軟文件,確認專案自帶 nuget.exe 是 2.6 版以前的事,這是所謂的 MSBuild-Integrated Package Restore 模式,特徵是 .sln 目錄有個 .nuget 資料夾內含 NuGet.config、nuget.exe、NuGet.targets 三個檔案。新版 Visual Studio 預設會在範本建立專案或編譯專案時自動還原套件,.NET Core 或 .NET Standard 專案變更 Project SDK 時也會自動還原,如下圖 Visual Studio 相關設定。

VS2013/VS2015 時代,NuGet Packaget Manager 為擴充套件需另外下載安裝。Visual Studio 2017 起,NuGet Package Manager (GUI 及 Console) 改為內建 (NuGet 4.x+ / MSBuild 15.1+),VS 則未包含 nuget.exe,VS 與 MSBuild 都具備還原套件功能,還有 Package Manager Console 可管理 NuGet 套件;.NET Core/.NET 5+ 專案的話,可用 .NET CLI (dotnet.exe) 安裝、移除、製作及發佈 NuGet 套件。因此,實務上己不太需要 nuget.exe (NuGet CLI),如需使用可從 NuGet 網站下載安裝。

回到古董專案上,如果專案現在是用 VS2017+ 編譯,可考慮升級 MSBuild-Integrated Package Restore 改為自動還原,做法是修改 csproj,將以下設定移除:

<RestorePackages>true</RestorePackages>
<!-- .... -->
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />

實測拿掉以上設定即可刪除 .nuget 目錄,改以 NuGet 新版做法自動還原,成功完成編譯。考古知識 +1。

TLS 1.2 issue of nuget.exe in old .NET project and how to upgrade it to automatic package restore.


Comments

Be the first to post a comment

Post a comment