考虑我们的解决方案的这个repo / file结构......
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
为了更轻松地使用代码,我们将共享项目直接引入应用程序的解决方案,例如,如果您打开App1.sln,这将是您的项目树......
App1.sln
├───Shared1.dll Project
├───Shared2.dll Project
├───App1 Project (Refs Shared1.dll project)
└───App1.dll Project (Refs Shared1.dll and Shared2.dll projects)
如您所见,这两个共享DLL来自一个单独的存储库,但包含在此解决方案中。 Visual Studio处理此问题没有任何问题,提示您在执行针对解决方案的提交时更新多个repos。这很好,正是我们想要的。
然而,我们遇到的问题是NuGet。根据我们的理解,NuGet.config(以及读取/应用它们的层次/优先级)与解决方案文件相关,因此项目' NuGet引用会相应更新。这会导致当您在App1.sln中工作时,Shared1.dll和Shared2.dll中的NuGet包的引用与App1.sln相关,这意味着其他人在App2.sln中工作并且没有&# 39;检查他们的两个中继线相对于彼此完全相同的方式,引用中断。
我们的解决方法是始终将所有三个中继检查到与兄弟姐妹相同的文件夹中,然后将包装文件夹作为另一个兄弟姐妹,添加' ../ 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使用的包在app1包中。
所以...这可能吗?您是否可以为每个项目指定不同的NuGet包下载路径,无论它们位于哪个解决方案中?
答案 0 :(得分:0)
我与/ u / MarquelV的情况相同。
从我的调查到nuget提供的选项(至少到版本3.5)来解决这种情况,我得出结论,必须完全忽略Visual Studio中的nuget图形工具(至少到目前为止)作为安装/恢复包,并禁用自动包恢复(工具 - >选项 - > Nuget等)。然后在需要安装/恢复包指定应放置包的文件夹时,从命令行调用nuget.exe - 这一点很重要,因为visual studio中nuget的图形界面在存储包中是弯曲的a"全球"存储库(通常紧邻解决方案的.sln文件)。
在我的项目中,我创建了一个.nunit文件夹,在每个项目和参考dll中都加入了nuget.exe。
最后但并非最不重要的是,每个项目都需要通过.csproj使用nuget来恢复包,如下所示:
<Target Name="BeforeBuild">
<Exec Command=".\.nuget\nuget.exe restore .\packages.config -PackagesDirectory .\packages"/>
</Target>
为了实现这里描述的目标,不能依赖用于nuget的图形工具和自动包恢复(工具 - &gt;选项 - &gt; Nuget)。
答案 1 :(得分:0)
我最近遇到了类似的问题。就我而言,我正在将项目从较小的解决方案组合到较大的解决方案。这些项目仍在其子文件夹中引用程序包,而我不想更改这些引用并破坏较小的解决方案。我可以通过将项目包路径符号链接到解决方案级别的路径来解决此问题。
mklink /J .\packages ..\packages
这实际上使项目误以为该项目实际上是在使用较大解决方案中的某个版本的软件包。
情况不完全相同,但是距离足够近,我希望它可以帮助某人。