nuget 包是如何還原的

WeihanLi發表於2020-06-20

nuget 包是如何還原的

Intro

一直以來從來都只是簡單的用 nuget 包,最近想折騰一個東西,需要自己搞一個 nuget 包的解析,使用者指定 nuget 包的名稱和版本,然後去解析對應的 nuget 包並新增引用到專案,
於是就想搞明白 nuget 包是怎麼還原的,對於本地已經下載了的 nuget 包又是怎麼找的

Nuget 包的引用

對於 dotnetcore 專案(這裡不算之前那種 project.json 的專案,只討論 *.csproj 這種專案),都是使用新的專案格式,PackageReference 模式

示例:

<PackageReference Include="WeihanLi.Common" Version="1.0.39" /> 

對於 dotnet framework 專案,如果使用 PackageReference 包格式和上面一樣,如果是傳統的 packages.config 包形式,會有一個 packages.config 的檔案包含引用的 nuget 包,檔案內容示例:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
</packages>

本文主要說明 dotnetcore 這種 PackageReference 這種形式

nuget 包的還原

nuget 包在第一次從 nuget.org 或自己的包源上下載之後會存放在本地的一個資料夾中,下次再需要相同版本的包還原時就會直接從本地的包中獲取,而這個儲存的資料夾是 nuget 配置的一部分,在網上可以找到一些修改 nuget 預設儲存 packages 資料夾的位置,但是這些文章都很類似,都只是給出了一個解決方案然而並沒有說明為什麼要這麼做,這麼做的根據是什麼並沒有說明,其實這種解決方案是新增了一個預設的 nuget 配置檔案,修改了 nuget 包儲存的位置

nuget 配置

預設配置

nuget 會有一些預設的配置,可以參考官方文件: https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file#config-section

nuget 配置中有一個 globalPackagesFolder 的配置,是用來指定預設的 nuget 包儲存的位置,在 Windows 上預設的儲存位置是 %userprofile%\.nuget\packages,在 Linux/Mac 上預設的儲存位置是 ~/.nuget/packages,可以使用 nuget.configNuGet.Config 配置檔案來修改預設的儲存檔案,除此之外,還可以通過環境變數的方式,配置 NUGET_PACKAGES 來修改預設 nuget 包儲存的位置

預設配置檔案

nuget 配置的預設配置檔案,官方文件:https://docs.microsoft.com/en-us/nuget/reference/cli-reference/cli-ref-config#options

Windows 上預設配置檔案的位置是 %AppData%\NuGet\NuGet.Config 這也是現在網上那些修改預設儲存 nuget 包位置的解決方案,
Linux/Mac 上大多是 ~/.config/NuGet/NuGet.Config,有的可能是 ~/.nuget/NuGet/NuGet.Config(和系統版本有關係)

Windows 上預設是沒有這個配置檔案的,新增這個預設配置檔案之後就是全域性作用的

建立 %AppData%\NuGet\NuGet.Config 這個預設的配置檔案,然後在這個配置檔案裡配置 globalPackagesFolder 來修改預設的 nuget 包儲存路徑

示例:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
  <config> 
    <add key="globalPackagesFolder" value="D:\nuget\packages" />
  </config>
</configuration>

Reference

相關文章