Consider this repo / file structure for our solution ...
Shared Repo (Checked out to D:/Shared/trunk)
├───Shared1.dll Project
└───Shared2.dll Project
App1 Repo (Checked out to C:/Code/App1/Trunk)
├───App1 Project (Refs Shared1.dll project)
├───App1.dll Project (Refs Shared1.dll and Shared2.dll projects)
└───App1.sln
App2 Repo (Checked out to C:/Code/App2/Trunk)
├───App2 Project (Refs Shared1.dll project)
├───App2a.dll Project (Refs Shared1.dll and Shared2.dll projects)
├───App2b.dll Project (Refs Shared1.dll and App2a.dll projects)
└───App2.sln
To simplify the work with code, we bring Shared projects directly to application solutions, which means, for example, if you open App1.sln, it will be your project tree ...
App1.sln
├───Shared1.dll Project
├───Shared2.dll Project
├───App1 Project (Refs Shared1.dll project)
└───App1.dll Project (Refs Shared1.dll and Shared2.dll projects)
As you can see, the two common DLLs are from a separate repository, but are included in this solution. Visual Studio handles this without any problems, prompting you to update multiple repositories when committing against a solution. This is beautiful and exactly what we want.
, , NuGet. , , NuGet.config( / /) , NuGet . , NuGet Shared1.dll Shared2.dll App1.sln, App1.sln, - App2.sln , , .
- , , , "../packages" NuGet.config . , , , .
C:/Code/
├───Shared Trunk
├───App1 Trunk
├───App2 Trunk
└───packages
, , , , . . , , , . .
C:/Code/
├───Shared Trunk
│ └─sharedpackages
├───App1 Trunk
│ └─app1packages
└───App2 Trunk
└─app2packages
, , App1.sln , Shared1.dll Shared2.dll "sharedpackages", , App1 App1.dll, app1packages.
... ? NuGet , ?