管理Nuget包用于存在于多个解决方案中的C#项目

3
我现在正在进行一个大项目的重构工作,这个项目有很多遗留和不稳定的模块。我决定将当前包含所有项目的解决方案(大约20个,由于单元测试项目的原因,未来还会有更多)分割成更独立和粒度更细的解决方案。
采用这种方法后,有些模块(如API客户端)需要在多个解决方案中引用或添加。问题在于,Nuget包只能在第一次添加它的解决方案中进行恢复。最简单的例子如下:
解决方案A: - 项目A - APIClient
解决方案B: - 项目B - APIClient
由于我们没有包含packages文件夹,这会导致Nuget包的问题:
1. 克隆repo。 2. 打开Solution B,构建并还原解决方案的Nugets。 3. Solution B中的ClientAPI包出现错误。 4. 转到Solution A,构建并还原解决方案的Nugets。 5. 回到Solution B。 6. Solution B中的ClientAPI Nugets已经被还原,错误已消失。
有没有办法以某种方式: - 使每个解决方案使用不同的路径? - 可能将解决方案链接在一起构建,使Solution A始终与Solution B一起构建?但这听起来像是失去了将这个大解决方案分解成更小的解决方案的一些好处。 - 使用其他方法使其更粒度更细,但不会遇到必须重新构建所有内容的问题?我听说过私有Nuget feeds,如果我的配置允许,这是否是解决此问题的答案?
我的配置: - 版本控制系统:TFS with TFVC - IDE:Visual Studio Proffesional 2017 - 默认包管理格式:Packages.config
2个回答

3
管理C#项目中的Nuget包,这些项目位于多个解决方案中。
感谢您的回复。我使用了两个解决方案重现了此问题:SolutionA 和项目 APIClient,以及将现有项目 APIClient 添加到 SolutionA 中并将其添加到 SolutionB 中。
然后,如果我们在 SolutionB 上还原 nuget 包,那么 SolutionB 文件夹中的项目 APIClient 中的包将默认还原到 SolutionB 文件夹中的 \packages 文件夹中,而不是还原到 SolutionA 文件夹中。
在这种情况下,项目 APIClientSolutionB 中仍然缺少 .dll 引用,您仍然需要前往 SolutionA 并还原 nuget 包。这就是您遇到该问题的原因。
要解决此问题,您可以在 SolutionASolutionB 旁边添加一个 NuGet.Config 文件,并使用以下内容:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositoryPath" value="C:\Packages" />
  </config>
</configuration>

因此,\packages 文件夹与解决方案文件无关。
另外,如果您有兴趣,可以尝试将 packages.config 转换为项目 APIClientpackagereference。使用此设置,NuGet 包将保存在全局包文件夹中:C:\Users\<UserName>\.nuget\packages
希望这可以帮助您。

是的,这就是确切的解决方案。非常感谢! - Kamil Stadryniak

0
为什么您没有在解决方案B中添加包?
您使用哪种包模式?
如果您使用“Package reference”模式,则必须在解决方案B的csproj中添加包信息。
如果您使用“Package config”模式,则必须在解决方案B的package.config文件中添加包信息。

如何检查包的模式? - Kamil Stadryniak
1
工具 -> Nuget 包管理器 -> 包管理器设置: 默认的包管理器格式 - Batbaille
答案已添加到问题描述中。将包添加到解决方案B是什么意思?它安装在添加到解决方案A和B的项目中。 - Kamil Stadryniak
1
你是对的,package.config文件在项目内部,因此在两个解决方案中都可用。那么,你确定Soluation B处于“Package config”模式吗?另一个想法,也许你在Nuget包的源头上有问题。Solution B是否有nuget.config?该文件包含Nuget包的来源。https://learn.microsoft.com/en-us/nuget/reference/nuget-config-file - Batbaille
您在先前评论中指定的位置是指全局设置中的默认模式。我该如何检查特定解决方案是处于哪种模式? - Kamil Stadryniak
你是对的,这是VisualStudio的Nuget包管理器的全局参数。还需要检查Nuget源(nuget.config)。 - Batbaille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接