【问题标题】:Managing Nuget packages for C# project present in multiple solutions管理多个解决方案中存在的 C# 项目的 Nuget 包
【发布时间】:2019-07-29 01:11:46
【问题描述】:

我现在正处于一个大型项目的疯狂重构阶段,该项目有很多遗留和不稳定的模块。我决定拆分解决方案,将当前包含所有项目(大约 20 个,因为单元测试项目肯定会在下个月出现)链接在其中,以使其更加独立和颗粒状。

使用这种方法有模块,例如需要在多个解决方案中引用或添加的 API 客户端。

问题在于,Nuget 包仅在最初首次添加的解决方案上得到恢复。所以最简单的例子:

解决方案 A:

------项目A

------API客户端

解决方案 B:

------项目B

------API客户端

由于我们不包含 packages 文件夹,因此会导致 Nuget 包出现问题:

  1. 克隆存储库。

  2. 打开解决方案 B,构建它并恢复 Nugets 以获得解决方案。

  3. 解决方案 B 中的 ClientAPI 包错误。

  4. 转到解决方案 A 构建它并恢复 Nugets 以获得解决方案

  5. 返回解决方案 B。

  6. 为解决方案 B 中的 ClientAPI 恢复 Nuget,并且错误消失了。

有没有办法:

  • 为每个解决方案使用不同的路径制作项目?
  • 也许在构建中使用链式解决方案以使解决方案 A 始终与解决方案 B 一起构建?但这听起来失去了将这一大解决方案拆分为较小解决方案的一些好处。
  • 使用任何其他方法使其更细化,但又不会因需要全部重建而遇到问题?我听说过私有 Nuget 提要,如果我的配置允许,这可以解决这个问题吗?

我的配置:

  • VCS:带有 TFVC 的 TFS
  • IDE:Visual Studio 专业版 2017
  • 默认包管理格式:Packages.config

【问题讨论】:

    标签: c# visual-studio build nuget projects-and-solutions


    【解决方案1】:

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

    感谢您的回复。我用两种解决方案重现了这个问题,SolutionA 和项目APIClient。和SolutionB,将SolutionA中已有的项目APIClient添加到SolutionB中。

    那么如果我们恢复SolutionB上的nuget包,SolutionB中项目APIClient中的包会默认恢复到SolutionB文件夹下的\packages文件夹中,而不是在SolutionA 文件夹中。

    在这种情况下,项目APIClient 仍然缺少SolutionB 中的.dll 引用,您仍然需要转到SolutionA 并恢复nuget 包。这就是你遇到这个问题的原因。

    要解决此问题,您可以在 SolutionASolutionB 旁边添加一个 NuGet.Config 文件,其内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <config>
        <add key="repositoryPath" value="C:\Packages" />
      </config>
    </configuration>
    

    所以,\packages 文件夹与解决方案文件无关。

    另外,如果您有兴趣,可以尝试将项目APIClientpackages.config转换为packagereference,这样设置后,nuget包将保存在全局包文件夹C:\Users\&lt;UserName&gt;\.nuget\packages .

    希望这会有所帮助。

    【讨论】:

    • 是的,这是准确的解决方案。非常感谢!
    【解决方案2】:

    为什么不在解决方案 B 中添加包?

    你使用什么打包模式?


    如果使用“包引用”模式,则必须在方案B的csproj中添加包信息。

    如果使用“Package config”模式,必须在方案B的package.config文件中添加包信息。

    【讨论】:

    • 如何查看打包模式?
    • 工具 -> Nuget 包管理器 -> 包管理器设置:默认包管理器格式
    • 答案已添加到问题描述中。将包添加到解决方案 B 是什么意思?它安装在添加到解决方案 A 和 B 的项目中。
    • 你是对的,package.config 文件位于项目内部,因此在两种解决方案中都可用。那么,您确定解决方案 B 处于“包配置”模式吗?其他想法,也许您对 Nuget 包的来源有疑问。解决方案 B 是否有 nuget.config ?该文件包含 Nuget 包的源代码。 docs.microsoft.com/en-us/nuget/reference/nuget-config-file
    • 您在上一条评论中指定的位置是指全局设置,因此默认模式。如何检查特定解决方案是否处于一种模式或另一种模式?