Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NuGet and multiple solutions

We have two solutions: foo.sln and bar.sln

I have a common library that is used by both foo and bar. Common.csproj is used by both.

If I open foo and update nuget references, all references in Common.csproj point to foo/packages/. If I later open bar and update nuget references, all references get set to those in bar/packages/. Naturally, this pisses off the foo team as it can cause incompatibilities between Common.csproj and Foo-specific stuff like Foo.Data.csproj, which still points to foo/packages.

There must be some obvious solution other than: "create a huge solution that contains all your projects, and if you need to touch nuget, only do it from that solution."

There seems to be an issue on codeplex, (the top voted issue, incidentally), but evidently I'm too thick to understand how this issue is resolved. Can someone explain how to fix this?

like image 799
Code Silverback Avatar asked Sep 15 '11 13:09

Code Silverback


People also ask

How do I add a NuGet package to multiple projects?

Right-click your solution > Manage NuGet Packages for Solution... ... Or: Tools > Library Package Manager > Manage NuGet Packages for Solution... And if you go to the Installed packages area you can 'Manage' a single package across every project in the solution.

How do you keep NuGet packages updated?

Within a solution you can use the NuGet Package Manager UI's "Manage packages for solution" and the consolidate tab helps makes sure all projects use the same version, but you'll need to repeat this for all solutions.

What is the benefit of NuGet package?

NuGet provides the tools developers need for creating, publishing, and consuming packages. Most importantly, NuGet maintains a reference list of packages used in a project and the ability to restore and update those packages from that list.

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

This problem preceeds NuGet. If you have a project referenced in two solutions, and change assembly references in the project when it is open in one solution, of course it will change the reference path for that project when it is open in the other solution. This has always been the case, regardless of how the reference was changed (with NuGet or otherwise).

But the real problem is that when you do an update, the updated packages do not appear in the foo/packages directory right?

The simple solution is to move Common.csproj into a solution of its own, with its own references, packages folder, build and release process. Then create a NuGet package of your own with any relevant dependencies built into it. Then you can install your Common package into both Foo and Bar and then the Foo team is free to update to the latest version of Common as and when they are ready.

The main argument that I have heard against this is that you might want to step through the Common code while debugging, but this is no longer an issue with Visual Studio 2010.

The fundamental question you need to ask is who owns Common.csproj? Is it the Foo team or the Bar team?

like image 122
Daniel Dyson Avatar answered Sep 22 '22 17:09

Daniel Dyson


I fix the problem by changing the hint path in the project fil to contain the $(SolutionDir) variable:

Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">       <HintPath>$(SolutionDir)packages\EntityFramework.6.1.3\lib\net40\EntityFramework.dll</HintPath> 
like image 26
Rolf Avatar answered Sep 22 '22 17:09

Rolf