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:
<?xml version="1.0" encoding="utf-8"?> | |
<package> | |
<id>Example</id> | |
<version>1.0.0</version> | |
<title>Example Lib</title> | |
<authors>Bart Wullems</authors> | |
<description>Hello world</description> | |
<contentFiles> | |
<files include="*" /> | |
</contentFiles> | |
</metadata> | |
</package> |
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:
<Project Sdk="Microsoft.NET.Sdk"> | |
<PropertyGroup> | |
<TargetFramework>netstandard2.0</TargetFramework> | |
<PackageId>Example</PackageId> | |
<Version>1.0.0</Version> | |
<Authors>Bart Wullems</Authors> | |
<Description>Hello world</Description> | |
</PropertyGroup> | |
</Project> |
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:
<Project Sdk="Microsoft.NET.Sdk"> | |
<PropertyGroup> | |
<TargetFramework>netstandard2.0</TargetFramework> | |
<!-- š Add this line --> | |
<NuSpecFile>Example.nuspec</NuSpecFile> | |
</PropertyGroup> | |
</Project> |
More information
NuGet Command-Line Interface (CLI) Reference | Microsoft Learn