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

时间:2019-04-26 08:34:05

标签: c# json.net 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:\JsonExamples\C#Examples\UseJsonInCSharp\packages" />
  </config>
</configuration>
  1. 重新启动Visual Studio 2015。

但这没用,因为using指令

using Newtonsoft.Json;

仍然无法识别!也许还有其他需要做的事情,我不知道,但是对老兵来说是常识吗?也许是因为Newtonsoft.Json的版本太新了,无法使用?有人可以帮我吗?非常感谢!

再说一遍:我目前正在使用VS 2017,但是我只找到了与VS 2015相关的答案,所以我想知道以前的方法(如果以某种方式在VS 2015上可行)是否能在VS 2017上使用。

1 个答案:

答案 0 :(得分:0)

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

  1. 项目中的引用工作是告诉该项目必须研究哪些外部代码-您不能绕开它,必须在要使用它的每个项目中都引用Newtonsoft.Json。
  2. NuGet的工作是将nuget下载/恢复到某个文件夹中-旧的NuGet 4之前版本的默认“哑”设置是在每种解决方案中制作一个单独的packages文件夹。让我们专注于如何使其更智能。


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


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

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

  

添加key =“ repositoryPath”值=“ NuGetPackages”