【问题标题】:nuget.config ignores dependencies of dependencies (sub-dependencies)nuget.config 忽略依赖项的依赖项(子依赖项)
【发布时间】:2019-03-05 18:05:29
【问题描述】:

我的项目有一个 nuget.config 并指定了一个 repositoryPath。我还指定了 globalPackagesFolder。

<config>
<add key="globalPackagesFolder" value="c:\p" />
<add key="repositoryPath" value="c:\p" />
</config>

现在我想在我的项目中安装第三方包。这个包正确地位于我指定的路径。

当我尝试安装另一个依赖于 System.Net.Http 且具有其他子依赖项的包时,nuget 无法安装此包,因为路径太长。

直接依赖项位于我从 nuget.config 指定的 repositoryPath 中。问题是,子依赖项不在此路径中。在此存储库中搜索文件未找到匹配项。

我在 nuget.config 中指定 repositoryPath 的唯一原因是我想将子依赖项移动到另一个文件夹,否则路径太长,nuget 无法安装包。这对我的同事来说不是问题。

如何改变这种行为?

如果这不可能,我的问题是否有其他解决方案? 一位同事建议缩短我的 Windows 登录,但这不是解决方案。我也无法缩短我们的 Teamcity 用户登录名。

我尝试安装的软件包是我公司开发的。因此,如果我必须更改包中的设置,这不是问题。

我尝试使用带有 Nuget 4.6.0 的 Visual Studio 2017 Pro 和 Enterprise 以及带有 Nuget 5.0.0 的 Visual Studio 2019 RC。 目标框架是 .NET Core 2.1

当我手动将包 System.Net.Http 添加到我的项目并安装包时,没有问题,但我宁愿不这样做,除非没有其他解决方案。

编辑: 为了澄清这种情况:如果我安装的包 A 依赖于包 B 并且 B 依赖于包 C,则包 A 在我指定的路径中,但 B 和 C 不在。我什至不知道包B和C在哪里。

【问题讨论】:

  • 你的意思是System.Net.Http的依赖在指定的路径中,但System.Net.Http的依赖不在那个路径? System.Net.Http 的依赖关系是什么,或者所有依赖关系都不在该路径中?你的目标框架是什么?
  • 我想安装包 A。它依赖于 System.Net.Http。 System.Net.Http还有其他依赖,我安装不了,因为路径太长了。一位同事已经安装了所有东西。包 A 位于指定的 repositoryPath 下,但该路径中没有 System.Net.Http。这就是我的问题。我想要 repositoryPath 中的所有包,而不仅仅是顶级包。我想在此路径中包含子依赖项。好像它们在我的用户文件夹中的某个缓存中。我的目标框架是 .NET Core 2.1
  • 感谢您的回复。要确认更多信息,您是否在 nuget.config 中设置了如下内容:&lt;add key="repositoryPath" value="SpecifiedPath " /&gt;?如果是,你可能做错了什么,这一套是针对 package.config 的,不是针对 .net core 项目的。但是为什么把包A设置在Specified Path里,那就奇怪了。
  • 我在 nuget.config 的配置部分尝试了 repositoryPath 和 globalPackagesFolder。我没有 NUGET_PACKAGES 环境变量。 &lt;add key="globalPackagesFolder" value="c:\p" /&gt; 和 &lt;add key="repositoryPath" value="c:\p" /&gt; 我们有核心和标准,所以我们在配置中都有这两个条目。

标签: visual-studio nuget


【解决方案1】:

nuget.config 忽略依赖项的依赖项(子依赖项)

这是 .NET Core 项目的正确行为。

在 dotnet core 或使用 PackageReference 的项目中,仅列出对直接依赖项的引用,并且仅将直接依赖项下载到包缓存中。

这就是为什么你安装依赖包 B 的包 A 和包 B 依赖包 C 的原因,包 A 显示在你的项目文件中,如下所示:

<PackageReference Include="PackageA" Version="1.0.0" />

并缓存在您指定的路径中,但 B 和 C 不是。

这是PackageReference 的最大优势之一,我们不会将项目文件与消费者可能不关心的大量依赖项混在一起。将您的 nuget 包安装到项目中,导航到 project_root/obj/project.assets.json 并打开此 json,您会看到您的包及其依赖项一起列出。如果您在此处看到您想要的依赖项,它会验证该包是否已正确编写。但 NuGet 不会将依赖项还原到包缓存中,除非您直接安装这些依赖项。

希望这会有所帮助。

【讨论】:

  • 好的,谢谢。所以我坚持直接添加对我项目的所有引用,路径太长了?我希望 Nuget 能尽快取消字符限制。
  • 但是如果您直接添加对项目的所有引用并使用设置&lt;add key="globalPackagesFolder" value="c:\p" /&gt;,这些引用将缓存在c:\p。那你还是得到 path is too long 错误?
  • 不,那么我不会收到此错误。但对我来说,这只是暂时的解决办法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
相关资源
最近更新 更多