﻿# NuGet 1.6 提供的新功能：啟用 NuGet  套件自動回復

我們之前常遇到一個狀況，當開發人員把方案/專案被建立並加入到 TFS 進行版本控管後，然後很開心的使用 NuGet 功能加入套件，不過卻忘記把 packages 也一併加入到 TFS 原始碼控管裡，以致於其他開發源開專案時變的無法管理 NuGet 套件的情況，這個問題到了 NuGet 1.6 開始已經獲得了改善，你現在可以使用 **Enable NuGet Package Restore** 功能徹底解決這個問題。

我們先來重現這個問題：

對於有啟用 NuGet 的專案，都會有個 packages.config 檔案

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2098ee798c8ade2fda8b-image_1381.png)

該檔案會含有該專案所有 NuGet 套件的名稱與版本資訊：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d7bbf989c47e81dbd89a-image_1382.png)

然而，所有已下載的 NuGet 套件檔案都會放在方案根目錄下的 packages 目錄裡：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/03d1362f4c72b254d315-image_1383.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/bde29977a0e207570540-image_1384.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/407d7d50a9c241eae90a-image_1385.png)

如果一切正常，檔案目錄都存在的情況，當你執行 Manage NuGet Packages 時：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f1ce145cda9bfcbdb4b0-image_1386.png)

你會在 **Installed packages** 看見目前已經安裝的套件清單：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c164b8a179c14001cd54-SNAGHTML1882ff93.png)

不過如果當你把方案根目錄下的 packages 資料夾砍掉（也就是當 UserA 沒有把 packages 目錄手動簽入 TFS，然後 UserB 把專案取出的狀況），在執行 Manage NuGet Packages 就會發生悲劇，如下圖，你會看到目前專案沒有任何已安裝套件的情況：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c487e435fef8841a7872-SNAGHTML1884fc39.png)

從 NuGet 1.6 開始，新增了一個 **Enable NuGet Package Restore** 功能，就是用來解決這個問題，只要你專案裡的 packages.config 設定檔還在，你就可以在 **建置** (Build) 的時候 自動將遺失的 NuGet 套件回復，以下是啟用的步驟說明：

1\. 先在「方案總管」裡選取**方案**，點選滑鼠右鍵，在點選 **Enable NuGet Package Restore**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a0c8e6c0d701499dea82-image_1387.png)

 ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/61be8c1aa4a334c0fc1c-SNAGHTML188c4125.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e0ec7f69e4f0a8deaf20-SNAGHTML188c514b.png)

啟用之後，你會發現在方案裡多了一個 **.nuget** 方案目錄，該目錄下也會有兩個檔案，其中 NuGet.exe 是 NuGet 指令列工具，而 NuGet.targets 則是 MSBuild 的設定檔。如果該方案原本就已經加入到 TFS 的話，這些目錄與檔案都會自動被加入 TFS 原始碼控管裡。這個 **.nuget** 目錄的實體路徑會位於方案根目錄下，如下圖示：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8f8cd1b1c6ee42cd74c8-image_1388.png)   ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4ce42f4a64aab8245f2a-image_1389.png)

2\. 由於我們剛剛已經把方案根目錄下的 **packages** 資料夾砍掉，你現在可以試著按下 F6 功能鍵進行建置，這個 **packages** 資料夾會自動被重新建立，而且裡面的 NuGet 套件也會在建置的過程中自動下載。

**備註事項**

-   如果你在升級 NuGet 的過程中發生問題 (通常是程式碼簽章憑證不一致的問題)，你可以先移除現有的 NuGet 舊版，然後再重新安裝新版 NuGet 即可。
-   有了 Enable NuGet Package Restore 這功能，今後你就可以不用再 Check-in 所有 NuGet 套件到版本控管裡，當專案多的時候也可以節省不少磁碟空間。

**相關連結**

-   [NuGet 1.6 Release Notes](http://docs.nuget.org/docs/release-notes/nuget-1.6)
-   [NuGet Docs](http://docs.nuget.org/)

-   [Managing NuGet Packages Using the Dialog](http://docs.nuget.org/docs/start-here/managing-nuget-packages-using-the-dialog#Managing_Packages_for_the_Solution)

-   [NuGet Nugget: File-System Based Package Stores](http://www.wintellect.com/CS/blogs/jgarland/archive/2011/12/17/nuget-nugget-file-system-based-package-stores.aspx)
