深入探討 dotnet restore
NuGet 特有的管理機制
.NET Core SDK 提供了 dotnet restore 指令,但官網的說明很簡單,只說明了他是 restore dependency,到底什麼是 restore dependency 呢 ?
Version
macOS High Sierra 10.13.3
.NET Core SDK 2.1.101
Node.js 8.9.4
NPM 5.7.1
NuGet vs. NPM
NuGet 與 NPM 都是為了解決 package dependency 的問題
相同之處 :
- NuGet : 採用
csproj紀錄所使用 package - NPM : 使用
package.json紀錄所使用 package
相異之處 :
- NuGet : 將 package 統一放在
~/.nuget/packages,若該 package 有多個版本,則以版本當目錄 - NPM : 多專案共用的 global package 統一放在
/usr/local/lib/node_modules/npm/node_modules,但若專案自己用的 package 則放在專案目錄的node_modules
PHP Composer 哲學與 NPM 類似,也分成 global package 與 local package
NuGet 優點
- 整個系統只有一份 package,省硬碟空間,而不像 NPM 每個專案都有重複的 package。
NuGet 缺點
- 當你刪除專案,系統可能會留著沒用到的 package
- 必須要有一份 mapping 檔案,讓 compiler 在 build 時,知道 package 放在哪裡,因為 package 不是放在專案目錄下。
第 2 點就是 dotnet restore 要解決的。
觀察 Console App

- 當使用
dotnet new console時,事實上只是建立了csproj - 自動執行
dotnet restore,根據csproj建立了nuget.g.props與nuget.g.targets

- 觀察
nuget.g.props,雖然很多資訊看不懂,但最少看到<NuGetPackageRoot>記載著 NuGet 目錄放在/Users/oomusou/.nuget/packages,這樣 compiler 就可以從這個目錄抓到 NuGet package 放哪裡
之所以沒用 VS Code 開啟專案,是因為 VS Code 還會自動建立其他目錄與檔案,怕模糊焦點,所以這裡選擇 Sublime Text
刪除 obj 目錄

- 選擇
obj目錄 - 刪除
obj目錄
dotnet restore
1 | ~/MyProject $ dotnet restore |
使用 dotnet restore 重新建立 obj 目錄。

- 輸入
dotnet restore - 根據
csproj重新建立nuget.g.props與nuget.g.targets

obj目錄被restore回來了
.NET Core 2.0
在 .NET Core 1.x 時代,還常常需要自己下 dotnet restore,但從 .NET Core 2.0 開始,當你使用以下 command 時,都會自動執行 dotnet restore。
dotnet newdotnet builddotnet rundotnet testdotnet publishdotnet pack
所以在實務上已經幾乎不用自己下 dotnet restore 了,只要有觀念即可,為了相容,目前 .NET Core SDK 還是有留下 dotnet restore 指令。
Conclusion
dotnet restore是根據csproj建立 package 與實際位置的 mapping 檔案- .NET Core 2 之後幾乎不用再自己下
dotnet restore指令,只要有觀念即可