Like mentioned in a previous blog post, I’ve
been looking into creating and hosting Nuget packages (the package management
system for .NET). While there still is a lot of things I don’t yet have
experience with, I feel confident enough to share the basics of it. But mostly because now I have the process written down for me, myself and I
Start by creating a new class library with
dotnet new classlib and implement whatever the library should do. At least for
simpler libraries there really isn’t any Nuget-specific considerations. You can
also start by installing the nuget-binary somewhere in your PATH.
After the implementation is done, it is
time to add the Nuget-specific metadata. This information can be specified in
two ways. Either by independent nuspec-files, or via the csproj-file on the
actual project. I tried to use just the project files, but ultimately this
proved to be a problem due to limitations of the Nuget CLI. If a project
references another, and that other project doesn’t have a nuspec-file, then it isn’t
added as a dependency, but instead the binary is directly included in the first
package. So, in the end I though it was easier to just define all the metadata
in a single file, the nuspec-file. Here is an example:
This file should be named similarly to the package id and project file. So in this case Dea.WebApi.AspNetCore.nuspec and Dea.WebApi.AspNetCore.csproj. To generate the package containing the binary of the project and all dependencies correctly marked, use a command in form of nuget pack -Build -IncludeReferencedProjects Dea.WebApi.AspNetCore.csproj. Even though the argument is the csproj-file, the nuspec-file is also automatically used, as it is similarly named. This also applies to the linked projects and their nuspec-files. If you want to make debugging easier, you can also add -Symbols flag to the command.
Pushing this package to a repository is
easy if you already have one set up (like described in the previous post): nuget
push -Source DeaAzure -ApiKey az Dea.WebApi.AspNetCore.0.2.1.symbols.nupkg
I was going to rant here about how
Nuget-package and Azure Artifactory break the debugging experience as there
really isn’t an easy way to get the symbols working. But it turns out that
everything supports them after all. It was just a matter of including them, and
being sure to change the format from Portable to Full. Changing the PDB-format
is usually one of the first steps I make when creating a new project, but for
some reason forgot to do it this time. Now everything just works :) Though I
would have preferred to have the symbols hosted separately so that not everyone
who has access to the packages has access to the symbols, too. Not that it
really matters, as I probably have to use Debug-builds anyway, and it is so easy to decompile the files back to source. And maybe some packages even have the source code available anyway...
But this is actually one great unknown. Is
there a way to nicely host (and consume!) different flavors of packages? One
with an optimized release-build, and another one in debug mode with all the
symbols included. A quick search didn’t reveal a simple solution for this.
Maybe we’ll never know.
Edit: also see the addentum about versioning.
Edit: also see the addentum about versioning.
No comments:
Post a Comment