【问题标题】:How to get NuGet packages to restore correctly for an existing project added from another solution?如何为从另一个解决方案添加的现有项目正确还原 NuGet 包?
【发布时间】:2023-03-10 04:05:01
【问题描述】:

我有两个 Visual Studio 2019 解决方案 A 和 B,它们都包含多个项目。解决方案 A 包括解决方案 B 中的一个项目 ProjectB,该项目已作为现有项目添加到 A。此项目使用多个 NuGet 依赖项。显然,NuGet 包不受源代码控制。当用户刚刚从源代码管理中签出解决方案时,会发生以下情况:

  1. 如果先打开并构建解决方案 B,ProjectB 的 NuGet 依赖项会按预期恢复,并且项目构建成功。
  2. 如果解决方案 A 在 1. 之后打开并构建,则一切都会成功构建。但是,如果省略第 1 步,ProjectB 将无法在解决方案 A 的范围内构建,因为它引用的依赖项不会在原始路径中重新创建,尽管 NuGet 已在 A 的 @987654322 中安装了所有依赖项@ 文件夹。这会导致出现大量“找不到引用的组件”错误消息,以及相当于this one 的情况。

简单地清理 NuGet 缓存并没有帮助。似乎可以解决问题的唯一方法是致电

Update-Package -reinstall -ProjectName ProjectB

在触发(重新)构建之前,来自解决方案 A 的包管理器控制台。

我想通过在预构建事件中包含 Update-Package 命令来自动执行此操作,但显然那里无法访问包管理器控制台,我想避免安装任何其他软件。

有没有办法在这种情况下正确地恢复所有项目依赖项,以便整个解决方案 A 自动从头开始构建?

【问题讨论】:

    标签: c# visual-studio nuget


    【解决方案1】:

    听起来您需要将 Nuget.Config 文件作为解决方案项添加到每个解决方案中,并将“respositoryPath”配置键添加到文件中,以便两个解决方案将 Nuget 包引用解析到同一文件夹:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <config>
         <add key="repositoryPath" value="../../Nuget/packages" />
      <config>
    </configuration>
    

    显然,您需要调整每个 Nuget.Config 文件的 repositoryPath 值,以便两个解决方案使用相同的路径(如果解决方案 A 在文件结构中比解决方案 B 低一个文件夹,您需要在路径中添加另一个../)。

    将 Nuget.Config 文件添加到每个解决方案后,您需要关闭/重新打开每个解决方案,然后运行 ​​Update-Package -reinstall 以确保更新每个项目文件中的引用路径。

    【讨论】:

      【解决方案2】:

      事实证明,您可以在项目中使用 PackageReference 格式而不是 packages 文件夹,这样做可以直接解决原始问题,无需任何额外操作。所以最优雅的解决方案是migrate from packages.config to PackageReference:在解决方案资源管理器中右键单击有问题的项目的References,然后在上下文菜单中单击Migrate packages.config to PackageReference。从现在开始,当项目包含在另一个解决方案中时,NuGet 依赖项将正确解析。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        • 2019-02-03
        • 1970-01-01
        • 1970-01-01
        • 2013-02-21
        • 2011-09-21
        • 2011-11-09
        相关资源
        最近更新 更多