Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create nuget package with multiple DLLs

Tags:

nuget

Let's say I have a project with this structure:

MyLibrary\   MyLibrary.sln   MyLibrary.Core\     MyLibrary.Core.csproj   MyLibrary.Extensions\     MyLibrary.Extensions.csproj   MyLibrary.Tests\     MyLibrary.Tests.csproj 

I want to create a single NuGet package which packages MyLibrary.Core.dll and MyLibrary.Extensions.dll. I can't seem to figure out how to get NuGet to do this. I've tried building a spec file manually and I've tried building one using "nuget spec MyLibrary.Core.csproj". I've tried adding all of the DLLs to a lib/ folder which I understand to be the convention-based mechanism for adding DLLs to the package. In every case I can get the MyLibary.Core.dll to get into the package but the MyLibrary.Extensions.dll does not end up packaged along with it.

TLDR: What is the best practice for creating a NuGet package with multiple projects / assemblies? Is there a tutorial out there that focuses on this? The tutorials I've found all focus on simple single-project demos.

like image 587
RationalGeek Avatar asked Sep 20 '11 14:09

RationalGeek


People also ask

How do I create a NuGet package from a DLL in Visual Studio 2017?

You can configure Visual Studio to automatically generate the NuGet package when you build the project. In Solution Explorer, right-click the project and choose Properties. In the Package tab, select Generate NuGet package on build.

What is the difference between DLL and NuGet package?

When you add features to your project via a nuget package, you're just adding files to your project. It can be javascript files (like jQuery), DLLs that your project references (like Newtonsoft JSON), or a whole bunch of things (like Entity Framework or Owin/SignalR) -- anything really.


2 Answers

You'll run NuGet on a single project (or nuspec file), but it supports pointers to other projects via the file element. This element uses the names of your project's References, so you avoid having to a) find the location of other project files, and b) copy files to a particular place as a post-build step.

Supposing you have a nuspec file for MyLibrary.Core.csproj, and it references MyLibrary.Extensions and MyLibrary.Tests such that they end up in the bin directory after a build:

<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">   <metadata>     ...   </metadata>   <files>     <file src="bin\Release\MyLibrary.Extensions.dll" target="lib\net40" />     <file src="bin\Release\MyLibrary.Tests.dll" target="lib\net40" />   </files> </package> 

With this setup, all of your references should end up in the appropriate place in the NuGet package. You still have the hard-coded 'Release' in there, but I'd wager most probably don't distribute NuGet packages of their debug builds anyway.

like image 132
ladenedge Avatar answered Sep 28 '22 05:09

ladenedge


Did you generate a blank nuspec file with:

nuget spec 

If you use that file and then put your dlls in a folder under it named lib, it will package them up.

I had a little trouble with trying to generate a nuspec file from a project or dll. Also, if you manually reference any files in the nuspec file, the conventions are not used. This is probably the problem with nuspecs generated from dlls or projects.

Also, if you are trying to run this from a build script that executes in a different folder, you can tell nuget the location of your .\lib folder via the -BasePath command line:

build\nuget.exe pack nuget\Company.Project.nuspec -BasePath nuget\ 
like image 21
BNL Avatar answered Sep 28 '22 06:09

BNL