7

I have nuget packages hosted on GitHub Packages. Then, when I try to list the packages in the github nuget feed using nuget.exe, it tells me that it can't list the packages in the feed:

> nuget list -Source "https://nuget.pkg.github.com/mabead/index.json"
WARNING: This version of nuget.exe does not support listing packages from package source 'https://nuget.pkg.github.com/mabead/index.json'.
No packages found.

Note that the packages are properly listed in Visual Studio when I use the window that opens up after clicking on "Manage Nuget Packages for Solution". So the feed works but it does not work with the nuget cli.

I am using version 5.5.1 of nuget.exe.

Any idea what I am using to be able to list the packages using the CLI?

mabead
  • 2,171
  • 2
  • 27
  • 42

2 Answers2

7

This beahvior is caused by the fact that not all nuget server expose the same set of API. The full set of possibly implemented APIs is defined here.

Let's compare the service index of nuget.org with the one of GitHub. The one of nuget.org is available here and it contains a very extensive set of APIs.

{
  "version": "3.0.0",
  "resources": [
    {
      "@id": "https://azuresearch-usnc.nuget.org/query",
      "@type": "SearchQueryService",
      "comment": "Query endpoint of NuGet Search service (primary)"
    },
    {
      "@id": "https://azuresearch-ussc.nuget.org/query",
      "@type": "SearchQueryService",
      "comment": "Query endpoint of NuGet Search service (secondary)"
    },
    {
      "@id": "https://azuresearch-usnc.nuget.org/autocomplete",
      "@type": "SearchAutocompleteService",
      "comment": "Autocomplete endpoint of NuGet Search service (primary)"
    },
    {
      "@id": "https://azuresearch-ussc.nuget.org/autocomplete",
      "@type": "SearchAutocompleteService",
      "comment": "Autocomplete endpoint of NuGet Search service (secondary)"
    },
    {
      "@id": "https://azuresearch-usnc.nuget.org/",
      "@type": "SearchGalleryQueryService/3.0.0-rc",
      "comment": "Azure Website based Search Service used by Gallery (primary)"
    },
    {
      "@id": "https://azuresearch-ussc.nuget.org/",
      "@type": "SearchGalleryQueryService/3.0.0-rc",
      "comment": "Azure Website based Search Service used by Gallery (secondary)"
    },
    {
      "@id": "https://api.nuget.org/v3/registration5-semver1/",
      "@type": "RegistrationsBaseUrl",
      "comment": "Base URL of Azure storage where NuGet package registration info is stored"
    },
    {
      "@id": "https://api.nuget.org/v3-flatcontainer/",
      "@type": "PackageBaseAddress/3.0.0",
      "comment": "Base URL of where NuGet packages are stored, in the format https://api.nuget.org/v3-flatcontainer/{id-lower}/{version-lower}/{id-lower}.{version-lower}.nupkg"
    },
    {
      "@id": "https://www.nuget.org/api/v2",
      "@type": "LegacyGallery"
    },
    {
      "@id": "https://www.nuget.org/api/v2",
      "@type": "LegacyGallery/2.0.0"
    },
    {
      "@id": "https://www.nuget.org/api/v2/package",
      "@type": "PackagePublish/2.0.0"
    },
    {
      "@id": "https://www.nuget.org/api/v2/symbolpackage",
      "@type": "SymbolPackagePublish/4.9.0",
      "comment": "The gallery symbol publish endpoint."
    },
    {
      "@id": "https://azuresearch-usnc.nuget.org/query",
      "@type": "SearchQueryService/3.0.0-rc",
      "comment": "Query endpoint of NuGet Search service (primary) used by RC clients"
    },
    {
      "@id": "https://azuresearch-ussc.nuget.org/query",
      "@type": "SearchQueryService/3.0.0-rc",
      "comment": "Query endpoint of NuGet Search service (secondary) used by RC clients"
    },
    {
      "@id": "https://azuresearch-usnc.nuget.org/autocomplete",
      "@type": "SearchAutocompleteService/3.0.0-rc",
      "comment": "Autocomplete endpoint of NuGet Search service (primary) used by RC clients"
    },
    {
      "@id": "https://azuresearch-ussc.nuget.org/autocomplete",
      "@type": "SearchAutocompleteService/3.0.0-rc",
      "comment": "Autocomplete endpoint of NuGet Search service (secondary) used by RC clients"
    },
    {
      "@id": "https://api.nuget.org/v3/registration5-semver1/",
      "@type": "RegistrationsBaseUrl/3.0.0-rc",
      "comment": "Base URL of Azure storage where NuGet package registration info is stored used by RC clients. This base URL does not include SemVer 2.0.0 packages."
    },
    {
      "@id": "https://www.nuget.org/packages/{id}/{version}/ReportAbuse",
      "@type": "ReportAbuseUriTemplate/3.0.0-rc",
      "comment": "URI template used by NuGet Client to construct Report Abuse URL for packages used by RC clients"
    },
    {
      "@id": "https://api.nuget.org/v3/registration5-semver1/{id-lower}/index.json",
      "@type": "PackageDisplayMetadataUriTemplate/3.0.0-rc",
      "comment": "URI template used by NuGet Client to construct display metadata for Packages using ID"
    },
    {
      "@id": "https://api.nuget.org/v3/registration5-semver1/{id-lower}/{version-lower}.json",
      "@type": "PackageVersionDisplayMetadataUriTemplate/3.0.0-rc",
      "comment": "URI template used by NuGet Client to construct display metadata for Packages using ID, Version"
    },
    {
      "@id": "https://azuresearch-usnc.nuget.org/query",
      "@type": "SearchQueryService/3.0.0-beta",
      "comment": "Query endpoint of NuGet Search service (primary) used by beta clients"
    },
    {
      "@id": "https://azuresearch-ussc.nuget.org/query",
      "@type": "SearchQueryService/3.0.0-beta",
      "comment": "Query endpoint of NuGet Search service (secondary) used by beta clients"
    },
    {
      "@id": "https://azuresearch-usnc.nuget.org/autocomplete",
      "@type": "SearchAutocompleteService/3.0.0-beta",
      "comment": "Autocomplete endpoint of NuGet Search service (primary) used by beta clients"
    },
    {
      "@id": "https://azuresearch-ussc.nuget.org/autocomplete",
      "@type": "SearchAutocompleteService/3.0.0-beta",
      "comment": "Autocomplete endpoint of NuGet Search service (secondary) used by beta clients"
    },
    {
      "@id": "https://api.nuget.org/v3/registration5-semver1/",
      "@type": "RegistrationsBaseUrl/3.0.0-beta",
      "comment": "Base URL of Azure storage where NuGet package registration info is stored used by Beta clients. This base URL does not include SemVer 2.0.0 packages."
    },
    {
      "@id": "https://www.nuget.org/packages/{id}/{version}/ReportAbuse",
      "@type": "ReportAbuseUriTemplate/3.0.0-beta",
      "comment": "URI template used by NuGet Client to construct Report Abuse URL for packages"
    },
    {
      "@id": "https://www.nuget.org/packages/{id}/{version}?_src=template",
      "@type": "PackageDetailsUriTemplate/5.1.0",
      "comment": "URI template used by NuGet Client to construct details URL for packages"
    },
    {
      "@id": "https://api.nuget.org/v3/registration5-gz-semver1/",
      "@type": "RegistrationsBaseUrl/3.4.0",
      "comment": "Base URL of Azure storage where NuGet package registration info is stored in GZIP format. This base URL does not include SemVer 2.0.0 packages."
    },
    {
      "@id": "https://api.nuget.org/v3/registration5-gz-semver2/",
      "@type": "RegistrationsBaseUrl/3.6.0",
      "comment": "Base URL of Azure storage where NuGet package registration info is stored in GZIP format. This base URL includes SemVer 2.0.0 packages."
    },
    {
      "@id": "https://api.nuget.org/v3/registration5-gz-semver2/",
      "@type": "RegistrationsBaseUrl/Versioned",
      "clientVersion": "4.3.0-alpha",
      "comment": "Base URL of Azure storage where NuGet package registration info is stored in GZIP format. This base URL includes SemVer 2.0.0 packages."
    },
    {
      "@id": "https://api.nuget.org/v3-index/repository-signatures/4.7.0/index.json",
      "@type": "RepositorySignatures/4.7.0",
      "comment": "The endpoint for discovering information about this package source's repository signatures."
    },
    {
      "@id": "https://api.nuget.org/v3-index/repository-signatures/5.0.0/index.json",
      "@type": "RepositorySignatures/5.0.0",
      "comment": "The endpoint for discovering information about this package source's repository signatures."
    },
    {
      "@id": "https://api.nuget.org/v3/catalog0/index.json",
      "@type": "Catalog/3.0.0",
      "comment": "Index of the NuGet package catalog."
    }
  ],
  "@context": {
    "@vocab": "http://schema.nuget.org/services#",
    "comment": "http://www.w3.org/2000/01/rdf-schema#comment"
  }
}

The one of GitHub available here contains a much more limited set of supported APIs:

 {
      "version": "3.0.0-beta.1",
      "resources": [
        {
          "@id": "https://nuget.pkg.github.com/mabead/download",
          "@type": "PackageBaseAddress/3.0.0",
          "comment": "Get package content (.nupkg)."
        },
        {
          "@id": "https://nuget.pkg.github.com/mabead/query",
          "@type": "SearchQueryService",
          "comment": "Filter and search for packages by keyword."
        },
        {
          "@id": "https://nuget.pkg.github.com/mabead/query",
          "@type": "SearchQueryService/3.0.0-beta",
          "comment": "Filter and search for packages by keyword."
        },
        {
          "@id": "https://nuget.pkg.github.com/mabead/query",
          "@type": "SearchQueryService/3.0.0-rc",
          "comment": "Filter and search for packages by keyword."
        },
        {
          "@id": "https://nuget.pkg.github.com/mabead",
          "@type": "PackagePublish/2.0.0",
          "comment": "Push and delete (or unlist) packages."
        },
        {
          "@id": "https://nuget.pkg.github.com/mabead",
          "@type": "RegistrationsBaseUrl",
          "comment": "Get package metadata."
        },
        {
          "@id": "https://nuget.pkg.github.com/mabead",
          "@type": "RegistrationsBaseUrl/3.0.0-beta",
          "comment": "Get package metadata."
        },
        {
          "@id": "https://nuget.pkg.github.com/mabead",
          "@type": "RegistrationsBaseUrl/3.0.0-rc",
          "comment": "Get package metadata."
        }
      ]
    }

So, the API required to execute nuget.exe list is supported by nuget.org but not by GitHub, thus explaining the warning explained in the console.

mabead
  • 2,171
  • 2
  • 27
  • 42
  • I take it this is why `Visual Studio 2019`'s Package Manager tool doesn't work with a GPR source? – Crono Sep 08 '21 at 16:56
  • It looks like the nuget.exe client's `list` functionality still uses the older NuGet v2 search API only. When using a v3 source, that requires the `LegacyGallery` resource to be listed in its index.json, pointing to the prefix for the V2 API endpoints, like `Search()`. – Zastai Dec 11 '21 at 14:01
  • Has anyone found a mitigation? – twinlakes Jan 06 '22 at 04:00
1

As a workaround, if you know a partial name, at the very least you can find out the latest version of a package, or set of packages.

I know that's not a solution: it is not the same as getting a list of all available packages. But it gives you important info: whether or not a new package is available that's higher than your current one.

The command:

nuget search "XYZ" -Source "https://nuget.pkg.github.com/Company-Name/index.json" -PreRelease

Replace XYZ with a substring of a known package. Replace Company-Name with your company name, or whatever the location of your packages index.json is.

The option -PreRelease at the end does what you'd expect: it includes pre-releases.

Abel
  • 56,041
  • 24
  • 146
  • 247