当我去查明 Chris B 是否为此创建了 NuGet 问题时,我找不到。编辑:他做到了,请参阅下面的评论。但我确实找到了用于解决此问题的 NuGet 的半文档功能:允许指定安装包的文件夹
让我把这个问题分成2个问题:
- 让 NuGet 允许多个解决方案使用相同的包位置
- 当您包含具有 NuGet 包的项目时,让 NuGet 包自动从源代码管理中获取
问题 1:默认情况下,NuGet 将包存储在解决方案文件夹中的包文件夹中。要更改该位置,请在解决方案的根文件夹中创建一个 nuget.config 文件,其中包含以下内容:
<settings>
<repositoryPath>..\..\..\Utilities\Library\nuget.packages</repositoryPath>
</settings>
<repositoryPath>
与您的解决方案相关;所以很明显,随心所欲。使每个解决方案都有自己的到相同包文件夹的相对路径。
就 NuGet 的流程而言,从那时起,repositories.config 中的路径相对于包含 repositories.config 的文件夹,而不是解决方案,因此现在所有项目/包都独立于解决方案位置进行管理。
这允许多个解决方案在源代码管理中使用相同的包,如果这些解决方案使用相同的项目(使用 NuGet 包),那么无论哪个解决方案更新包,这些解决方案/项目都将保持同步。
问题1完全解决了。
问题2:
让我从两个角度来解决这个问题。这适用于 Visual Studio 和 TFS——我将 SVN 留给其他人来解决。
首先:如果您的驱动器上没有源代码并获得解决方案(而不是项目),我更愿意这样做,以便您获得解决方案需要构建的所有内容。不应该有任何遗漏的参考资料去手动抓取。我们可以通过将包文件添加为解决方案项来做到这一点。是的,在每个解决方案中。是的,需要做一些工作,但是完成后,包文件将自动从源代码管理中获取/更新。
第二:在新的解决方案中,当您包含具有 NuGet 包的现有源代码管理项目时,您必须手动从源代码管理获取包并将它们添加为解决方案项。至少在未来获得您的解决方案的任何其他人都会自动获得成功构建所需的一切。至少对于 VS/TFS,AFAIK 就是这样。如果 projB 依赖于 projA,并且您将 projB 添加到新解决方案中,VS/TFS 不会自动从 TFS 中获取 projA。您必须手动执行此操作。因此,对于 dll 引用(如 NuGet 包)也是如此。
我的解决方案总结:
- 所有解决方案的源代码控制中只有一个包副本
- 任何解决方案都可以更新包,所有其他解决方案将保持同步*
* 一旦一个解决方案将包更新为新的路径或文件名,它们将显示为缺少对其他解决方案的引用,您必须手动清理它。但至少你知道包在源代码控制中的位置“(而不是 RandomSolution\packages 位置)。”