使用Nuget API查詢Package版本

最近需要做一個小工具去整理出指定資料夾所有使用的第三方套件版本,同時去查詢nuget最新版本號。
拆解步驟大概就是兩個

  • 掃出使用套件清單
  • 以這個清單查尋nuget最新版本

透過以下語法找出所有 .csproj 檔名的檔案,並找到第三方套件的內容。
我們找一個 csproj 範例如下:

1
2
3
4
5
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
</ItemGroup>
</Project>

透過以下語法找到檔案並解析內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//找出所有 .csproj 檔案
var allFiles = Directory.GetFiles(arg, "*.csproj", SearchOption.AllDirectories);
//依序以 XDocument 載入並解析出第三方套件的名稱與版本號
foreach (var file in allFiles)
{
var projDefinition = XDocument.Load(file);
var elements = projDefinition.Element("Project")?.Element("ItemGroup")?.Elements("PackageReference");

if (elements == null)
continue;
if (!elements.Any())
continue;
var pkgRefs = elements.ToDictionary(x => x.Attribute("Include")?.Value, x => x.Attribute("Version")?.Value);
}

剩下的功能就是查詢 Nuget 取得版本號碼。
由於大部分人的使用都是直接使用 IDE 或 VS 的 package management console 來安裝,幾乎沒有使用 api 去呼叫的需求,這類型的資訊在網路上很少;若是哪天要整理的內容變很多時,手動就感覺特別的沒有效率。 我絕對不會承認官方文件看好久還是看不懂

透過 Package 名稱去查詢版本號碼其實並不太難,在 v3 api 中格式如下:

1
https://api.nuget.org/v3-flatcontainer/{PackageName}/index.json

只要把{PackageName}替換成套件名稱即可。而 Nuget 會回傳一個 json 格式資料,我們以查詢 Newtonsoft.Json 套件為例。
Url example:

1
https://api.nuget.org/v3-flatcontainer/Newtonsoft.Json/index.json

為了精簡版面,省去中間版本號內容,結果如下:

1
2
3
4
5
6
7
8
9
{
"versions": [
"3.5.8",
"4.0.1",
"12.0.2-beta2",
"12.0.2-beta3",
"12.0.2"
]
}

寫到這邊其實就結束了,可以透過迴圈與 HttpClient 去呼叫 Nuget 取得這樣結果; 他也幫你排好順序,其實直接取用 .Last() 即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static async Task<string> GetResultAsync(string url)
{
var result = "";
try
{
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(url);

if (response != null)
{
if (response.IsSuccessStatusCode)
{
result = await response.Content.ReadAsStringAsync();
}
else
{
}
}
}
catch (Exception ex)
{
}
return result;
}

Reference

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。