【问题标题】:Project reference VS NuGet项目参考 VS NuGet
【发布时间】:2018-07-09 13:59:34
【问题描述】:

我应该如何在同一解决方案中从project B 引用另一个project A
如果我得到什么,我会失去什么:

  • 添加对project A 的引用作为项目引用。
  • project B中安装project A的NuGet包。

困扰我的事情是构建依赖项、版本控制..?
或者这是否完全破坏了解决方案的目的?

【问题讨论】:

  • 项目参考是天作之合。您遇到的具体问题是什么?
  • 项目与包引用以及解决方案/repo 分离通常更符合管理版本和发布周期的方式,以及处理它们的开发团队如何根据技术需求构建

标签: visual-studio msbuild nuget solution


【解决方案1】:

项目参考 VS NuGet

项目引用或者NuGet是我们开发过程中很常见的问题,需要根据自己的实际情况选择使用哪一个。

例如,如果引用的项目A在开发过程中经常被修改,我们推荐使用Project reference。因为如果你使用nuget,你必须重建引用的项目,重新创建nuget包,将那个nuget包重新安装到项目B,甚至你必须将它发布到服务器。这会带来很多不必要的工作,而且我们在修改引用的项目A后经常忘记更新我们的nuget包。如果使用项目引用,就不会出现这些问题。修改后引用的项目 A 会在我们构建项目 B 之前自动更新。

另一方面,当我们将引用的项目 A 共享到解决方案之外,或者将该项目共享给其他人时,nuget 将是一个更好的选择。它具有更多的便携性。

因此,当您在同一解决方案中从项目 B 引用另一个项目 A 时,将推荐项目引用,在将参考项目共享到解决方案外或将项目共享给其他人时,nuget 更合适。

此外,还有一个 Visual Studio 扩展 NuGet Reference Switcher,它会自动将 NuGet 程序集引用切换到项目引用,反之亦然。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    使用第一种方法,您可以获得简单性,因为您不需要生成新版本的 ProjectA nuget 包,您在其中所做的每一次更改(即 ProjectA.nupkg)。

    但是,使用第二种方法,您可以获得可移植性,因为您可以轻松地与其他项目/解决方案共享相同的 nuget 包。

    就个人而言,我只为旨在与其他解决方案共享的项目创建 nuget 包。 (例如库和框架)。

    希望这可以帮助您做出决定!

    【讨论】:

      【解决方案3】:

      现在有了新的 csproj 格式,您可以同时使用两者(如果您在同一个解决方案中有两个项目)。

      在您的示例中,您可以从 project B 引用 project A 作为项目引用。然后,如果您想将project A 作为 NuGet 包发布,您只需将以下标记添加到它的 csproj 中的 PropertyGroup

          <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
      

      情节转折:如果您也想将 project B 作为 NuGet 包发布,只需添加 GeneratePackageOnBuild 目标 - MSBuild 会将 projectA.nupkg 设置为 projectB.nupkg 中的依赖项。

      这样,您可以在内部处理您的项目,同时将它们作为包发布给第三方或其他团队。

      【讨论】:

      • 您可以使用 .nuspec 文件对旧项目执行此操作,当您发布 NuGet 包时,如果引用的项目具有 .nuspec 文件,它将自动将其添加为 NuGet 引用.
      • 如果您更改项目 A 但忘记发布它的新版本,然后使用依赖于新更改的代码发布项目 B,会发生什么?
      • 如果两个项目在同一个解决方案中,您可以同时执行更改并一起发布。如果您只是将 projectB 推送到您的提要,那么它将引用当前不存在的 projectA 包版本,因此您需要确保将它们一起发布。 NuGet 包需要良好的 CI\CD 流程。
      • 你在描述一些不同的东西。生成包与引用包不同。为了与问题相关,project A 必须能够引用project B 并同时引用B.nupkg。在这种情况下,VS 有点不稳定——如果第二次添加 NuGet 引用,它会在解决方案资源管理器中保留带有黄色警告符号的引用。如果第二次添加项目引用,它会卸载冲突的 NuGet 包(静默,这不是理想的 UX)。
      • 你是对的,它比问题所要求的要多。我的解决方案添加的是两个选项的合并:您可以在解决方案中将 A 作为项目引用,但如果您要发布 B,则 A 将自动作为包引用。使用旧的 csproj 格式时情况并非如此,其中 B 包只会在其 lib 文件夹中包含所有引用的二进制文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 2020-07-24
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多