WinGetSpy: WinGet 패키지 정보 조회 라이브러리

식탁보의 기능을 보강하기 위한 목적으로 만든 작지만 유용한 유틸리티 라이브러리를 하나 공유합니다. WinGetSpy라고 이름을 붙였보았습니다.

이 라이브러리를 사용하면 Windows 10 후반부 및 Windows 11부터 기본 탑재되어있는 WinGet 패키지 매니저가 참조하는 GitHub의 WinGet 피드를 읽어 특정 소프트웨어의 설치 패키지 정보, 버전 정보를 조회할 수 있게 도와줍니다.

이 패키지는 .NET Standard 2.0을 대상으로 만들어졌습니다.

다음은 간단한 몇 가지 사용 예시입니다.

패키지 데이터 캐싱 + 검색

using WinGetSpy;

...

var searchKeyword = "Microsoft.DotNet.SDK.8";
var matchFirstItemOnly = true;
var list = await WinGetCatalogManager.LoadCatalogAsync();

var searchResult = list.SearchWinGetPackage(searchKeyword, matchFirstItemOnly);
...

현재 실행 중인 Windows OS와 가장 잘 맞는 설치 패키지 URL 찾기

using WinGetSpy;

...

var searchKeyword = "Microsoft.DotNet.SDK.8";
var matchFirstItemOnly = true;
var list = await WinGetCatalogManager.LoadCatalogAsync();

var searchResult = list.SearchWinGetPackage(searchKeyword, matchFirstItemOnly).First();
var downloadUri = searchResult.GetBestInstallerUrlFor();
Console.WriteLine(downloadUri);

...

대표성이 있는 패키지 쉽게 찾기

몇 가지 대표적인 소프트웨어 패키지들 (예: 파이썬)은 라이브러리에 확장 메서드로 코드를 추가하여 쉽게 최신 버전의 설치 패키지를 찾을 수 있는 부가 기능을 넣어두었습니다.

using WinGetSpy;
using WinGetSpy.KnownPackages.DevTools.Python;

...

var result = list.GetJetBrainsPyCharmProfessionalEAP();
Console.WriteLine(result.GetBestInstallerUrlFor());

...

이 라이브러리 외에도 최근 식탁보 관련 개발을 진행하면서 여러 소소하고 유용한 NuGet 패키지들을 연속으로 출시하고 있습니다. 기회가 되는대로 하나씩 공유해보겠습니다!

6 Likes

WinGet 패키지의 특성이 어떤 지는 잘 모르지만, reverse search 기능이 있으면 좋을 듯합니다.

보여주신 라이브러리는 패키지 이름으로 설치 URL을 검색하지만, 리버스 서치는 반대로 기능의 이름으로 패키지(또는 설치 URL)를 찾아 내는 것이죠.

예를 들면, “DbContext” 를 입력하면, “Microsoft.EntityFramework.Core” 를 찾아 내는 것입니다.

vs code extension 중에 Nuget Reverse Package Search 가 있는데, 기능은 완벽하지 않지만, 꽤 잘 쓰고 있습니다. c# dev kit 에 있는 인텔리센스의 부족한 점을 잘 보완하고 있습니다.

기능이 완벽하지 않다는 의미는,

“DbContext” 를 입력하면, "Microsoft.EntityFramework.Core 1.0"이 검색되고, 이를 선택하면 .csproj 에 1.0 이 추가됩니다. 당연히 restore 과정에서 버전 문제가 발생합니다.

보여 주신 예제 코드를 보아 버전 문제를 해결하신 듯 합니다.

2 Likes

피드백 감사합니다. 아쉽게도 WinGet은 퍼블리셔나 개발자가 올려주는 설명을 검색하는 정도가 최선이고, 그 외 나머지 부분들은 집단 지성의 힘을 빌어서 검색 키워드를 만들어야 Reverse Search가 의미있게 작동하지 않을까 생각합니다.

예를 들어, MSYS2 패키지 ( winget-pkgs/manifests/m/MSYS2/MSYS2/20210604 at master · microsoft/winget-pkgs (github.com))를 살펴보면 영어와 중국어로 패키지 설명을 올려둔 것을 볼 수 있는데, 단지 이 매니페스트 설명만으로는 https://packages.msys2.org/ 에서 제공하는 MSYS2 패키지의 상세 정보와 매칭할 수 있는 근거를 만들기 어렵습니다. MSYS2에 대한 다른 지식을 메타데이터 같은 것으로 넣어둔다면 구현이 가능하겠지만, 적어도 현재 버전의 WinGet 매니페스트에서는 이런 부분을 고려하지 않은 것으로 알고 있습니다.

일단 제가 파악하기로는 이것이 한계인데, 혹시 제가 못 본 다른 확장 기능이 있는지 알려주시면 검토해보겠습니다. 관련해서 Issues · rkttu/WinGetSpy · GitHub 에 새 이슈를 추가해주시면 더 좋을 것 같습니다!

ps. Reverse Search 때문은 아니지만, 각 개별 패키지에 대한 품평이나 상세 정보를 모아놓은 위키 웹 서비스를 새롭게 만든다면 말씀하신 Reverse Search에 근접한 기능도 구현하고, 패키지에 대한 커뮤니티의 참여도도 높일 수 있겠다는 생각도 듭니다. :thinking:

2 Likes