在具有相同输出路径的多个解决方案项目上使用NuGet

时间:2018-11-18 10:27:22

标签: c# reference nuget nuget-package project-structure

我尝试查看这里提出的许多问题,但没有一个完全符合我的设置。

此外,此问题与Nuget并不直接相关,但可能是解决方案的一部分。

我有一个包含一些解决方案的项目。这些解决方案中的所有项目都使用相同的输出路径。

示例:

-Root
--Solution1
--Solution2
--Solution3
--OutputForAllProjectsInAllSolutions

我想在这些解决方案中使用NuGets。问题是,如果在每个解决方案中使用同一版本的同一NuGet软件包的不同版本,则每个解决方案将覆盖其前身的参考dll。

我在考虑解决方案,但我不知道这是否可行以及如何实现。

类似的东西:

-Root
--Solution1
--Solution2
--Solution3
--PackagesFolderForAllSolutions // can be done with repositoryPath right?
--OutputForAllProjectsInAllSolutions
---NugetPackageVersion1
---NugetPackageVersion2
---NugetPackageVersion3

有可能吗?这是一个好的解决方案吗?怎么做? 如果没有,有什么更好的建议吗?

谢谢。

  • 编辑:我希望我可以为所有人使用1个解决方案,但这是旧代码,并且过于复杂。

设置是1个具有多种解决方案的源代码存储库。

1 个答案:

答案 0 :(得分:1)

真正的问题似乎是“我如何确保所有项目都使用相同版本的依赖项”,但是对于您是否提议使用共享软件包文件夹以节省磁盘空间的问题,我还是不清楚。使用共享文件夹并不能解决多个版本的问题,您只会得到一个包含多个版本的packages文件夹,但是也许您想节省磁盘空间,所以我将作为一个单独的问题回答。我将避免使用自以为是的“好的解决方案”,但是我认为您要求的“更好的解决方案”是将所有项目迁移到PackageReference并使用我在下面提供的解决方案。还考虑使用单个解决方案,但这与nuget软件包版本无关。

  

如何确保我的所有项目都使用相同版本的NuGet依赖项

  • 多个源代码控制存储库中的代码

如果您的代码分布在多个源代码存储库中,那么如果您的跨项目引用是内部nuget包,则通过nuget包依赖于其他存储库中的项目的项目将可传递地获得外部nuget依赖项,因此只需避免升级下游项目中的nuget软件包。升级意味着升级上游项目,生成具有更高依赖版本的新nuget,生成程序包,然后更新下游项目中内部程序包的版本。这很费力,这就是为什么我不喜欢将应用程序/系统分布在多个源代码存储库中的原因。这样做仍然有可能超过成本,并且对我来说,这就是工程学所要解决的问题。

  • 单个存储库中的代码。多种解决方案,通过packages.config
  • 的NuGet软件包

如果您的代码位于单个存储库中,则您的项目中至少有一个使用packages.config,并且您的应用程序分布在多个解决方案中,那么仍然会有相当数量的手动工作,但是{ {1}}个项目,工作量将减少。您可以将这种方法用于单个解决方案应用程序,并针对每个解决方案进行多次操作。

  • 一种解决方案,通过packages.config的NuGet软件包

右键单击解决方案,选择“管理解决方案的NuGet软件包”,然后转到“ Consolodate”选项卡。

  • 通过packages.config
  • 的NuGet软件包

如果您使用PackageReference,则您的回购包含单个解决方案还是多个解决方案都没关系。您可以使用NuGet软件包版本创建MSBuild props文件。举个例子,看看这个ASP.NET Core example。如果将这些属性放在存储库根目录下名为PackageReference的文件中,则新版本的MSBuild应该(我从未亲自对其进行过测试)自动导入它。否则,您将需要编辑所有项目文件以包含对props文件的导入。然后,您编辑项目文件并更改版本以使用MSBuild属性。同样,example from the ASP.NET Core repo。缺点是您不能再使用Visual Studio更新程序包版本,但仍可以使用它来检查新版本并查看最新版本。

如果您的应用程序有多个存储库,并且有多个项目正在使用PackageReference,则可以考虑将props文件放入git子模块或与源代码控制系统等效的模块中。

总结

我强烈推荐migrating from packages.config to PackageReference,然后您可以使用MSBuild props文件自动使用所有依赖项的相同版本保留所有项目。

  

我可以通过将单个packages文件夹用于多种解决方案来减少磁盘空间

首先,如果您的所有项目都使用Directory.Build.props,这将不是问题,因为NuGet不会将PackageReference软件包复制到解决方案文件夹中,因此与使用PackageReference共享时相比,磁盘使用量甚至更少包文件夹,因为您仍将在全局包文件夹中保留一个副本,在解决方案包文件夹中保留另一个副本。

但是,如果您不能/不会迁移到PackageReference,则可以,如您在问题中所问的那样,可以在根级别使用nuget.config文件将packages.config设置为解决方案在根级别使用相同的packages文件夹,只要解决方案文件夹没有自己的<repositoryPath>packages</repositoryPath>文件即可覆盖该设置。您可以将nuget.config更改为所需的任何内容,但是我不鼓励使用packages,因为当项目在其存储库根目录之外写入文件时,我讨厌这样做。