考虑我们解决方案的版本库/文件结构...
为了更方便地处理代码,我们直接将共享项目引入应用程序的解决方案中。例如,如果您打开App1.sln,那么这将是您的项目树...
正如您所看到的,这两个共享的 DLL 来自一个单独的代码库,但包含在此解决方案中。Visual Studio 可以毫无问题地处理这一点,当您对解决方案执行提交操作时,会提示您正在更新多个存储库。这很好,并且正是我们想要的。
然而,我们遇到的问题与 NuGet 有关。据我们了解,NuGet.config(以及其读取/应用的层次结构/优先级)相对于解决方案文件,因此项目的 NuGet 引用会相应地更新。这会导致问题,因为 Shared1.dll 和 Shared2.dll 中的 NuGet 包引用是相对于 App1.sln 的,当您在 App1.sln 中工作时,意味着如果其他人在 App2.sln 中工作,并且他们没有以与您完全相同的方式检出两个源代码库,则引用将会断开。
我们的解决方法是始终将所有三个源代码库作为兄弟姐妹放在同一个文件夹中进行检出,然后将打包文件夹作为另一个兄弟姐妹放在同一级别下,在 NuGet.config 旁边添加 '../packages'。这可以确保引用永远不会中断,但会强制确定检出的位置,这可能会成为问题。
然而,如果我们能够指定每个项目的软件包下载位置,我们就可以将打包文件夹相对于项目本身放置,这意味着无论您将它们检出到哪里,它们都会始终找到所需的软件包。是的,在我们的示例中,这意味着会有重复的软件包下载,但磁盘空间不是问题。代码的维护才是重点。
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 可以毫无问题地处理这一点,当您对解决方案执行提交操作时,会提示您正在更新多个存储库。这很好,并且正是我们想要的。
然而,我们遇到的问题与 NuGet 有关。据我们了解,NuGet.config(以及其读取/应用的层次结构/优先级)相对于解决方案文件,因此项目的 NuGet 引用会相应地更新。这会导致问题,因为 Shared1.dll 和 Shared2.dll 中的 NuGet 包引用是相对于 App1.sln 的,当您在 App1.sln 中工作时,意味着如果其他人在 App2.sln 中工作,并且他们没有以与您完全相同的方式检出两个源代码库,则引用将会断开。
我们的解决方法是始终将所有三个源代码库作为兄弟姐妹放在同一个文件夹中进行检出,然后将打包文件夹作为另一个兄弟姐妹放在同一级别下,在 NuGet.config 旁边添加 '../packages'。这可以确保引用永远不会中断,但会强制确定检出的位置,这可能会成为问题。
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包下载路径,而不管它们在哪个解决方案中?