如何在多个 C# 解决方案之间共享同一个 NuGet 包?



我现在正在使用Newtonsoft.Json(又名 Json.net),多个C#解决方案需要引用它。似乎最方便和广泛使用的方法是使用 NuGet 包管理器安装 Newtonsoft.Json。但是我发现该包安装在解决方案根目录中(无论如何,安装基于给定的解决方案),并且它的大小不能忽略(略高于 10M),所以我想知道是否有一种优雅的方式在不同的 C# 解决方案之间共享此包。

我搜索了Google,发现很少有令人满意的结果(也许是因为我没有正确表达我的要求);唯一合理的答案是在目录和解决方案中创建一个.nuget文件夹,并用NuGet.config文件填充它,如下所示:

  1. 在解决方案的根目录中创建一个 .nuget 文件夹(实际上通过输入".nuget.")

  2. 在该文件夹中,创建一个文件 NuGet.config。

  3. 在 Visual Studio 2015 中,右键单击解决方案并添加一个名为".nuget"的新解决方案目录

  4. 右键单击该文件夹并选择添加现有文件,然后选择在 (2) 中创建的 NuGet.config 文件。

  5. 在 NuGet.config 文件中添加如下内容:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<solution>
<add key="disableSourceControlIntegration" value="true" />
</solution>
<config>
<add key="repositoryPath" value="E:JsonExamplesC#ExamplesUseJsonInCSharppackages" />
</config>
</configuration>
  1. 重新启动Visual Studio 2015。

但这不起作用,因为 using 指令

using Newtonsoft.Json;

还是认不出来!也许还有其他事情必须做,我不知道,但对退伍军人来说是常识?或者这可能是因为Newtonsoft.Json的版本太新了,无法正常工作?有人可以帮助我吗?多谢!

还有一个词:我目前正在使用VS 2017,但我只找到了与VS 2015相关的答案,所以我想知道以前的方法,如果以某种方式适用于VS 2015,将永远适用于VS 2017。

让我们首先澄清一些有关 NuGet 和项目中引用的内容:

  1. 项目中引用的工作是告诉这个项目必须研究哪些外部代码 - 你不能绕过它,你必须在你想使用它的每个项目中引用Newtonsoft.Json。
  2. NuGet 的工作是下载/还原某个文件夹中的 nuget - 旧 NuGet 4 之前版本的默认"愚蠢"设置是在每个解决方案中创建一个单独的包文件夹。让我们专注于如何使其更智能。


选项 1(推荐)- 将所有内容迁移到包引用
自 VS 4 中的 NuGet 2017+ 以来,它就可用(我建议至少使用 VS 2017 15.7+,它获得了从旧 nuget 版本自动迁移的向导)。这是引用 NuGet 的最干净方法,因为项目中的包引用不会对 NuGet 下载位置进行硬编码。相反,它将此决定留给本地 NuGet 设置。默认情况下,它设置为"%USERPROFILE%\.nuget\packages"。没有 nuget 包是重复的,它充当此计算机的全局缓存。若要强制所有新项目默认使用包引用,必须修改 NuGet.config,方法如下:将包管理默认为包引用


选项 2 - 为同一存储库
中的所有项目指定公共 NuGet 位置 NuGet 配置设置按解决方案加载。即使使用 PackageReference,也建议使用 NuGet 的通用配置文件,因为下载位置只是你可能希望集中管理所有解决方案的众多设置之一(另一个常用设置是要使用的外部 NuGet 存储库的设置)。NuGet 下载位置设置被新的包引用忽略,因此可以在混合方案中安全地使用它。非常重要,使用此旧 NuGet 的项目使用对 NuGet 文件夹的硬编码引用,因此每次更改此 NuGet 位置设置时,都必须手动修复每个项目中的所有 NuGet 引用(通过手动编辑 .csproj 文件或删除并重新添加 NuGet),因此请明智地选择并且不要更改。

有关如何正确设置全局 NuGet.config 的详细信息:因此,
首先让我解释一下共享 NuGet.config 设置的工作原理。NuGet 扫描从解决方案位置向上到根驱动器的所有 NuGet.config 文件(它还检查所有 .nuget 文件夹)。如果检测到多个配置文件,则采用最接近解决方案的文件。例如,你有"C:\Code\Repository1\Project1\Solution1.sln"。如果要为存储库 1 中的每个解决方案提供通用的 NuGet 设置,请将配置文件放在类似"C:\Code\Repository1\NuGet.config"的位置。还要确保这是整个 Repository1 文件夹中唯一的配置文件。下一步是决定下载所有包的位置,例如"C:\Code\Repository1\NuGetPackages"。若要使所有计算机上的所有内容动态工作,请在 NuGet.config 中放置相对路径,如下所示:

add key="repositoryPath" value="NuGetPackages">

最新更新