将具有所有依赖项的 Nuget 包下载到文件夹的命令

Command to download a Nuget package with all dependencies to a folder

是否有 windows 命令将 Nuget 包及其依赖项下载到文件夹,以便我可以将它们传输到离线计算机? 我的意思是一个命令,我可以给出 Nuget 包的名称,它会将包及其所有依赖项作为 nupkg 文件下载到文件夹中。

我知道有一些镜像工具,但实际上我正在尽可能使用命令行寻找我的特定问题的答案。

您可以使用 nuget.exe 的 -OutputDirectory 参数来指定文件夹。

示例:

nuget install NUnit -Version 3.11.0 -OutputDirectory c:\packages

您需要在使用 cmd 的路径环境或当前文件夹中有 nuget.exe。 这将输出到解压的依赖项和 nukpg 文件到所选文件夹。在此之后,您可以手动将 nukpg 文件复制到所需位置,或者您可以使用简单的命令行复制脚本来仅复制 nukpg 文件。

还有一个名为 nufetch 的工具。它只会下载 nukpg 文件,但此工具会将不必要的依赖文件下载到。 (我推荐使用nuget)

如果您正在寻找只需要编写少量脚本的预构建解决方案,我不知道有这样的工具。但是,我不相信你会特别难做你想达到的目标。下面的长答案是因为我提供了很多细节,而不是我认为的更难。

第 1 步:收集包裹

在联网的计算机上恢复存储库中的所有项目。如果您有任何项目使用 packages.config,它们的包已经为您收集在解决方案包文件夹中。它们也应该在全局包文件夹中,但是如果您清除全局包文件夹并在包已存在于解决方案包文件夹中时恢复,它们将不会 downloaded/extracted 进入全局包文件夹。使用 PackageReference 的项目只会将其包提取到全局包文件夹中。

因此,如果您在内部连接的计算机上恢复所有解决方案,则全局包文件夹可能包含您需要的所有包,但从技术上讲,您可能还需要从解决方案包文件夹中获取包。

一种选择是简单地从您的全局包文件夹中复制所有包,但可能包含您的解决方案不需要的包。如果你只想复制你的解决方案使用的包,那么首先复制解决方案包文件夹中的包,因为它们肯定被某些东西引用,否则它们将不存在。然后,编写一个程序来读取每个 PackageReference 项目的 obj\project.assets.json 文件,因为它包含完整的依赖关系图。让您的项目从所有这些文件中获取 NuGet 包列表,然后您将获得需要从全局包文件夹中复制的包列表。

另一种选择是创建 nuget.config 文件和 specify a custom globalPackagesFolder before doing the restore. If you do this, I recommend you also add your profile's global packages folder as a package source,这样恢复速度会快得多。只要您的自定义全局包文件夹在开始之前是空的,那么它将只包含您的解决方案使用的包。

第 2 步:选择您希望离线计算机获取包的方式

从技术上讲,您可以简单地将解决方案包文件夹从源计算机复制到目标计算机,并将全局包文件夹从源计算机复制到目标计算机。然而,一个工具总是有可能改变不同版本工具的行为,所以我更愿意让工具管理它们自己的数据。一个例子是全局包文件夹包含一个 .nupkg.sha512 文件,在最新版本的 NuGet 中,还有一个 .nupkg.metadata 文件,这些文件不存在于解决方案包文件夹中。由于 NuGet 的工作方式,如果将解决方案包文件夹复制到全局包文件夹中,它将不起作用。这在未来可能会改变,但在我写这篇文章的时候,它不会起作用。

因此,我建议只复制 .nupkg 文件,并在您的离线计算机上创建一个 nuget.config 文件,添加您复制所有 .nupkg 的文件夹作为一个package source。这个 nuget.config 文件不需要在你的仓库中。您可以利用 NuGet 分层累积配置这一事实,并在离线计算机的根目录上创建此 nuget.config(或者如果您将所有存储库克隆到一个位置,则可以将其放在那里),因为它只是必需的通过离线机器。只要您的项目 none 具有清除 packageSources 部分的 nuget.config,那么 nuget.config 所在子文件夹中的所有项目都会自动将其用作包源。

TL;DR

最简单的方法(假设您想编写脚本)是:

  1. 在您联网的计算机上,创建一个 nuget.config 文件(dotnet new nugetconfig,虽然它会创建一个可怕的 nuget.config 来清除包源,但我找不到好的方法删除 <clear/> XML 元素)
    • globalPackagesFolder 设置为自定义路径 (nuget.exe config -set globalPackagesFolder=usedPackages -configfile nuget.config),当前为空
    • packageSource 添加到您的用户配置文件的全局包文件夹 (nuget.exe sources add -name globalPackagesFolder -Source %USERPROFILE%\.nuget\packages -configfile .\nuget.config),以提高性能
  2. 恢复所有项目(nuget.exe restore my.sln
  3. 递归搜索您的自定义全局包文件夹,并仅将 .nupkg 文件(如果使用 powershell Get-ChildItem .\globalPackagesFolder\ -Recurse -Filter *.nupkg | Copy-Item -Destination .\nupkgs\)复制到您将用于传输到离线计算机的设备。您可以(应该?)将 .nupkg 复制到一个平面文件夹中。
  4. 将设备中的 .nupkg 复制到专门用作离线源的文件夹中。
  5. 如果您创建了执行上述操作的脚本,那么此时您的脚本可以自行清理,例如删除 nuget.config 文件和自定义全局包文件夹。
  6. 在离线计算机上创建一个 nuget.config 文件,将离线源文件夹添加为包源(dotnet new nugetconfig,删除 <clear/> and change the sample source in the file to the directory you copied thenupkg`s)。