【问题标题】:What causes NuGet to restore package to slightly different folder structures?是什么导致 NuGet 将包还原到略有不同的文件夹结构?
【发布时间】:2020-03-31 00:54:59
【问题描述】:
Visual Studio 2019

我有一个.NET Core 解决方案,它需要引用单个.NET Framework 包,只是为了将包内容扩展到packages 文件夹,以便可以使用一些工具。

在我的.csproj 我有这行:

<PackageReference Include="roundhouse" Version="1.1.0" TargetFramework="net472" />

我发现当我构建我的解决方案(在本地开发人员Visual StudioTeamCity 中)时,有时NuGet 会将我的包恢复到这个文件夹结构:

\packages\roundhouse.1.1.0\roundhouse.1.1.0.nupkg

这就是它目前正在做的事情。

但是在另一台开发机器上(以及在TeamCity Build Agent 上),构建会创建这个文件夹结构:

\packages\roundhouse\1.1.0\roundhouse.1.1.0.nupkg

注意细微差别。

我无法弄清楚可能导致这些不同的行为。我找不到任何与NuGet 包文件夹结构相关的配置设置。

有人知道吗?

【问题讨论】:

  • 嗨 BaltoStar,这个问题有更新吗?我检查了您上面的行,发现这不是正常的 PackageReference 格式。它看起来像 package.config 和 packageReference 的组合...我认为这可能是您遇到的奇怪行为的原因,如果您删除“TargetFramework="net472"` 并运行重建,结果会是什么,可以吗?让奇怪的行为消失?如果它仍然阻止您,请随时告诉我们,我们会尽力提供帮助,并希望它可以帮助其他有类似问题的成员。谢谢 :)
  • 嗨,BaltoStar,您是否尝试过 Lance 的建议来解决您的问题?顺便说一句,TargetFramework="net472" 表示将包安装到属于框架 4.7.2 的项目中,因此它根本不适合 .net 核心项目。如果您有任何疑问,请随时告诉我们。
  • 我知道在netcore 项目中包含net472 包是不正常的,但我需要强制解包此包的文件并位于package 文件夹中,因为我需要将它们用作工具。据我所知,它不会引起任何问题。我从来不明白为什么有时它会被解包到一个稍微不同的文件夹结构中。

标签: visual-studio package nuget restore roundhouse


【解决方案1】:

我找不到任何控制哪个文件夹结构的配置设置 被使用了。

我认为这种行为与 nuget 包格式 packages.configPackagesReference 有关。

全局包文件夹(%userprofile%\.nuget\packages ) 是 NuGet 安装任何下载包的位置。每个包都完全展开到与包标识符和版本号匹配的子文件夹中。使用 PackageReference 格式的项目始终直接使用此文件夹中的包。使用 packages.config 时,包会安装到 global-packages 文件夹,然后复制到项目的 packages 文件夹中。来自here的提示。

结论

使用PackageReference时,全局包文件夹中的nuget路径类似于结构2。

\packages\roundhouse\1.1.0\roundhouse.1.1.0.nupkg

此外,从 global-packages 文件夹复制的解决方案中的包已更改为结构 1 的路径。

\packages\roundhouse.1.1.0\roundhouse.1.1.0.nupkg

当您使用 package.config 格式时,Nuget 会出于某些特定原因修改从 global-packages 文件夹复制到解决方案的 nuget 的路径。

这只是 package.config 和 PackagesReference 的正常行为,它就是这样设计的。

更新1:

我发现你在一个核心项目的 xxx.csproj 中添加了&lt;PackageReference Include="roundhouse" Version="1.1.0" TargetFramework="net472" /&gt;。这种格式就像框架项目的 packages.config 中的内容。我猜你只是将packages.config中的内容复制到核心项目的xxx.csproj中,尽管你使用了packageReference。另外,TargetFramework="net472"表示会在framework4.7.2上安装包,所以不会出现在核心项目中。

我做过这些测试;

1) 带有 packages.config 的框架项目

packages.config

xxx.csproj

它加载packages.config来加载nuget包

2) 带有 PackageReference 的框架项目

xxx.csproj

3)核心项目

所以我认为是您导入 nuget 包的方式导致了这种奇怪的行为。并且请不要在核心项目(PackageReference)中使用像TargetFramework="net472"这样的packages.config格式。如果您确保在解决方案中的所有项目中都使用PackageReference,您可以尝试以下步骤:

解决方案

1) 清理 nuget 缓存

2) 更改您在 xxx.csproj 中的初始参考格式,例如

<ItemGroup>
    <PackageReference Include="roundhouse" Version="1.1.0" />
</ItemGroup>

然后你可以看看恢复路径是否不同。

希望对你有帮助。

【讨论】:

  • 感谢您的信息。我已经扩展了我的帖子以包含更多细节 - 特别是我在 .NET Core 解决方案中使用 .NET Framework 包,但仍然看到 roundhouse.1.1.0 文件夹。
  • 我认为您在两台机器上恢复nuget的方式不同导致了这个问题。请检查您的机器并将Packages.config更改为PackageReference管理格式。
  • 正如我已经提到并编辑了我的原始帖子以包括:我在我的.csproj 中专门使用PackageReference 用于我的.NET Core 项目。我没有packages.config
  • 通常情况下,我们不应该使用net core项目来引用框架nuget包,这会导致不兼容项目的警告。我不确定这是否是这种奇怪行为的原因。如果你想让它与net core项目兼容,我建议你可以将nuget更改为net standard,它适用于framework和core项目。
猜你喜欢
  • 2013-07-15
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 2013-06-13
  • 2016-02-29
  • 2012-05-19
  • 1970-01-01
  • 2015-11-05
相关资源
最近更新 更多