【问题标题】:Nuget package content in Visual StudioVisual Studio 中的 Nuget 包内容
【发布时间】:2020-08-17 13:40:58
【问题描述】:

我在 Visual Studio 2019 中创建了一个使用 NuGet 包 (SQLite) 内容的小项目。 当我在 Visual Studio 中构建我的项目并在调试模式下运行它时,一切正常。但是当我将生成的文件从输出目录复制到另一个目录或另一台计算机时,它会失败,告诉我它没有从 NuGet 包中找到文件。

对于我正在使用的 NuGet 包,它缺少两个文件。当我将这两个丢失的文件从 NuGet 包目录复制到我的项目文件时,它又可以工作了。

但这真的是要走的路吗?假设我的项目越来越大,并且需要越来越多的 NuGet 包,我真的需要猜测每个 NuGet 包,我可能需要其中的哪些文件以及我可以在硬盘驱动器上的什么位置找到这些文件?

另一件事是我在我的 Windows 用户目录中的某个位置找到了来自 NuGet 包的文件,而不是在我的代码目录中。因此,如果我将我的代码存档并将其提供给其他人或稍后使用它,那么代码中将缺少 NuGet 包。

所以,这是我的问题:

1) 有没有办法告诉 Visual Studio 将所有需要的文件从所有使用的 NuGet 包中自动复制到输出目录?

2) 是否可以将下载的 NuGet 包存储在靠近我的源代码而不是我的 Windows 用户目录的位置?我只想归档一个目录来备份我的所有源代码。

我快速查看了构建后事件,可能会在构建后事件中将所有丢失的文件复制到输出目录,但这不是可行的方法,因为我仍然需要确切知道我需要哪些文件需要复制以及在哪里找到它们,并且所述文件的路径可能会因计算机而异。

【问题讨论】:

  • 您是否在 net core 项目中安装了SQLite?我认为问题在于,当您执行此类操作时,您应该在当前用户帐户中还原 nuget 包,然后在构建时,VS 会找到 nuget 包,然后将它们复制到输出文件夹中。
  • 我在一个 .NET Standard 项目中安装了 SQLite,但我从来没有机会决定将文件安装到哪里。

标签: visual-studio nuget visual-studio-2019


【解决方案1】:

我认为您正在使用 PackageReference Nuget Mangement format 来管理项目中的 nuget 包。

PackageReference nuget 格式 直接从本地 nuget 缓存中引用 nuget,不会将 nuget 包复制到您的项目中。好像是链接参考。这是PackageReference的特性。

当您将项目移动到另一个代理中,然后想要使用其内容时,您应该确保 nuget 包仍在您当前的代理环境中。

所以,首先,你应该do a nuget restore。然后您可以将丢失的包裹找回给您的代理。

解决方案资源管理器上右键单击您的解决方案-->Restore Nuget Packages

有没有办法告诉 Visual Studio 复制所有必要的文件 自动从所有使用过的 NuGet 包到输出目录?

其实,之前packagereference有一个问题,时不时会丢失nuget包中的内容,无法完全复制到输出路径。见this

所以您可以尝试将其添加到您的 xxx.csproj 文件中:

<PropertyGroup>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>

是否可以将下载的 NuGet 包存储在更近的地方 到我的源代码而不是在我的 Windows 用户目录中?我想 只需归档一个目录即可备份我所有的源代码。

Windows 用户目录是nuget global caches,它将下载代理中此类文件夹中的所有包,然后项目从那里引用 nuget 包。

还要注意

它根据当前用户而不是当前机器工作。它就是这样设计的。所有 nuget 包都存储在当前用户级目录中。切换操作系统账号无法获取其他用户目录下的nuget包。

如果你想修改它的路径,你应该修改Nuget.Config(C:\Users\xxx(use r name)\AppData\Roaming\NuGet\NuGet.Config)文件:

添加这些节点:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
....
<config>

    <add key="globalPackagesFolder" value="xxxxx(the custom path)" />
</config>
....

</configuration>

然后重启VS,以后安装的nuget包就会安装在这个包里。

更新 1

首先,请检查您的代理,确保互联网可以快速访问。

对于那些付费的nuget包,你应该做其他操作,然后你可以从nuget服务器安装它。

如果 nuget 包需要付费或从 nuget 服务器中删除,恢复操作将找不到该包或需要您进一步的额外步骤。然后恢复操作就会成功。

对于那些旧的废弃的nuget包,它存在于你的旧代理的global nuget cache下,所以在你的旧代理中,你可以找到它。

但是当您将项目迁移到新代理时,由于nuget包已从nuget服务器中删除,因此新代理将找不到它并且无法恢复该包。如果您的旧代理中还有旧的nuget包,您可以移动到新环境,然后需要将其新地址配置为nuget package source,然后恢复操作将成功。

毕竟,您应该确保每个 nuget 包都可以找到并且对nuget.org 服务器没有额外的要求,或者对它们进行一些操作,因为您的项目太旧并且 nuget 包已经发生了很大的变化。您应该仔细检查它们。

【讨论】:

  • 谢谢,我会看看。切换客户端时再次下载 Nuget 包的问题是,新客户端的互联网连接可能很弱,或者可能需要为下载的内容付费。当我可以只提供编译和运行所需的文件时,这不是必需的。另外,如果我归档我的代码并尝试让它在 10 年后再次运行,则所需的 Nuget 包可能不再可用。
  • 如果 nuget 包需要付费或从 nuget 服务器中删除,恢复操作将找不到包或需要您进一步的额外步骤。如果旧的废弃的nuget包还在本地,只需将其地址配置为nuget package source,然后恢复操作就会成功,或者如果没有nuget包,则没有办法。
  • 所以要实现你的目标,你应该仔细检查每个nuget包,确保每个包都存在于包源下,并且没有其他第三方要求安装。之后就可以成功恢复了。
【解决方案2】:

现在我可以看一下 Perry 的 cmets 和答案,但我不得不说...... NuGet 甚至不像人们期望的那样方便使用或接近工作。

添加

<PropertyGroup>
    <CopyLocalLockFileAssemblies>True</CopyLocalLockFileAssemblies>
</PropertyGroup>

到我的项目文件确实将引用的文件从 NuGet 包 (SQLite) 复制到构建输出文件夹。缺少一个必要的文件,但我猜这是 SQLite 的问题,而不是 NuGet(我不直接引用这个文件,但如果它丢失了,一条错误消息会告诉我)。

但我无法将 NuGet 包存储在更靠近源代码的位置。我知道,Nuget 能够做到这一点,因为 NUnit 的 NuGet 包存储在项目文件夹内一个名为“包”的文件夹中。

但是添加

<config>
    <add key="globalPackagesFolder" value="xxxxx(the custom path)" />
</config>

到 NuGet.config 文件(如建议的那样),重新启动 Visual Studio 并重新构建我的项目确实向我的自定义路径 (130 MB) 添加了很多包,但不是我引用的唯一包目的(SQLite)。

【讨论】:

  • 我建议您可以标记您的答案,以便帮助其他社区成员搜索类似的问题。你这样做真是太好了。
猜你喜欢
  • 2014-06-25
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
相关资源
最近更新 更多