Skip to content

Testing a NuGet Package Locally

Recently I’ve been upgrading a few of my packages for use with Umbraco 10, and have thus had to learn how to build a NuGet package, since — well - that’s a requirement now if I want to be able to install the thing.

While the packages themselves were pretty straightforward upgrades (i.e. no changes required - they “just worked”), the process wasn’t a smooth one - so let’s have a look at why that was.

As always, here’s a TL;DR link for your next visit (our mine, probably!).

Types of Testing

Developing

So first off, I should explain what kind of testing I’m talking about here, because there are a couple of different scenarios. While you’re developing a package (or in my case, converting an existing one) we want to use it in Umbraco and we want our changes to be reflected right away, so we can iterate and make everything work.

Umbraco has a special dotnet CLI invocation for this, creating an Umbraco solution specifically referencing (in the .csproj file) your package’s files instead of its NuGet reference. This way, you’re only a dotnet run command away from testing any changes to your package.

You do this by adding the --PackageTestSiteName (or -p for short) parameter when creating a new Umbraco project:

dotnet new umbraco -n <ProjectName> -p <PackageProjectName>

Installing

Now, the other kind of testing is to make sure that your package actually installs correctly, because the above does not make any such guarantees. If you’re like me and you don’t know what you’re doing (!) you could easily waste an hour or more trying to figure out why your package doesn’t work for anyone else but yourself!.

This happens because the PackageName.targets file format is a little difficult to understand when your package needs to install files other than a built DLL (that’s all my packages).

So you don’t want to publish a package to NuGet before you know it works (you can’t delete a faulty package from NuGet) - but the dotnet add package command immediately goes to nuget.org looking for the package … ¯\_(ツ)_/¯.

That is, until you do a little digging and find out that you can specify a “source” when adding a package to a project.

Then you do a lot more digging and trying out things before you realise that you don’t need to set up your own private NuGet server, but you can “just” add your package to the “locals” source and install it from there. in fact, you can add your package using the --source parameter pointing to the directory of your .nupkg file. Thanks for the tip Sebastiaan!

The Steps

When you’ve built your .nupkg package, start a command prompt in your test site’s project folder and add the package using the path to the directory that holds your local .nupkg file:

dotnet add package Package.Name --source ../path/to/nupkg-files

That’s it!


Alternatively, you can use a “locals” source, in which case there’s an extra step for adding the package to the “locals” source first:

nuget add ../path-to-package/Package.Name.1.2.3.nupkg -Source locals

Then you add it to your project, this way:

dotnet add package Package.Name --source locals

Whichever process you choose, the last step is to run the project:

dotnet run

Oh, and remember to increase the package version every time, because even though it looks like it grabs your .nupkg file from a folder inside your project, there’s definitely some caching going on that will trip you up. Trust me :)