My understanding has always been that when packaging a library in a nuget package, I had 2 options available:
- Option 1 - Using a nuspec file with nuget pack command
- Option 2 - Using a csproj file with dotnet pack command
Turns out I was wrong. So I want to use this post to explain where I was wrong. But before I do that let me dive into the 2 options above…
Using a nuspec file with nuget pack
One option you have is to put all the metadata for your nuget package inside a nuspec file. Here is how such a file can look like:
To transform this nuspec file to a valid nuget package, use the following command:
nuget pack example.nuspec
Using a csproj file with dotnet pack
A second option is to put all the metadata inside your csproj file:
Now we can transform this to a valid nuget package, use the following command
dotnet pack example.csproj
Where was I wrong?
Both of the options above work, but first of all I though that these are the only options(my first mistake) and second I thought that these options were mutually exclusive(my second mistake).
My first mistake
Next to the 2 commands above you can also use msbuild directly:
# Uses the project file in the current folder by default
msbuild -t:pack
You can trigger the same command by setting the following property inside your csproj file:
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
My second mistake
I also discovered that you can still use a nuspec file when using dotnet pack. Inside your csproj file you can point to the location of a nuspec file:
More information
NuGet Command-Line Interface (CLI) Reference | Microsoft Learn