Ever wonder what nuget or dotnet restore is doing? What feeds it using? Or what nuget.config it is using to find feeds?

Turns out you can find out what nuget-related information dotnet restore by looking at the logs.

Generally, dotnet restore is succinct. Restoring a HelloWorld project gives us little information about what’s going on:

$ dotnet new console --no-restore
The template "Console Application" was created successfully.
$ dotnet restore
  Restore completed in 72.1 ms for /home/omajid/cliche/dotnet/HelloWorld/HelloWorld.csproj.

If we add a nuget.config file, we still see little information. Not even enough to know if it’s even being used:

$ rm -rf *
$ dotnet new console --no-restore
The template "Console Application" was created successfully.
$ dotnet new nugetconfig
The template "NuGet Config" was created successfully.
$ ls
HelloWorld.csproj  nuget.config  Program.cs
$ dotnet restore
  Restore completed in 52.87 ms for /home/omajid/cliche/dotnet/HelloWorld/HelloWorld.csproj.

And it certainly doesn’t give us a hint about any other nuget.config files are being used.

But we can find out more from dotnet restore by increasing the verbosity to normal:

$ rm -rf *
$ dotnet new console --no-restore
The template "Console Application" was created successfully.
$ dotnet new nugetconfig
The template "NuGet Config" was created successfully.
$ dotnet restore --verbosity:normal
Build started 5/29/2020 11:14:01 PM.
     1>Project "/home/omajid/cliche/dotnet/HelloWorld/HelloWorld.csproj" on node 1 (Restore target(s)).
     1>Restore:
         Restoring packages for /home/omajid/cliche/dotnet/HelloWorld/HelloWorld.csproj...
         Committing restore...
         Generating MSBuild file /home/omajid/cliche/dotnet/HelloWorld/obj/HelloWorld.csproj.nuget.g.props.
         Generating MSBuild file /home/omajid/cliche/dotnet/HelloWorld/obj/HelloWorld.csproj.nuget.g.targets.
         Writing assets file to disk. Path: /home/omajid/cliche/dotnet/HelloWorld/obj/project.assets.json
         Restore completed in 54.6 ms for /home/omajid/cliche/dotnet/HelloWorld/HelloWorld.csproj.

         NuGet Config files used:
             /home/omajid/cliche/dotnet/HelloWorld/nuget.config
             /home/omajid/.nuget/NuGet/NuGet.Config

         Feeds used:
             https://api.nuget.org/v3/index.json
     1>Done Building Project "/home/omajid/cliche/dotnet/HelloWorld/HelloWorld.csproj" (Restore target(s)).

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.43

Now we can see a list of all the nuget.config files being used. Turns out there is one in my home directory at ~/.nuget/NuGet/NuGet.config that I probably would have missed even if I had dug around in the project directory.

If you are wondering about the particular output format, this is just the normal log output from msbuild. That’s why we see a Task called Restore running.

There are a couple of possible configurations for verbosity. q (or quiet) is the default. n (or normal) can be handy. diagnostic or detailed can show a lot of information that can be a bit hard to parse by hand.

You can even make the invocation smaller: dotnet restore -v:n sets verbosity (via -v) to normal (via n).

Hopefully, you now have a new tool to debug/traces any issues you might be hitting during dotnet restore!