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

yek*_*chi 2 cmd nuget nuget-package

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

我知道有一些镜像工具,但实际上我正在寻找我的特定问题的答案,如果可能的话。

ziv*_*kan 6

如果您正在寻找一个只需要编写一点脚本的预构建解决方案,我不知道有这样的工具。不过,我不认为你做你想做的事会特别困难。下面的长答案是因为我提供了很多细节,而不是我让它变得更困难。

第 1 步:收集包裹

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

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

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

另一种选择是在执行恢复之前创建一个nuget.config文件并指定一个自定义文件。globalPackagesFolder如果您这样做,我建议您还将配置文件的全局包文件夹添加为包源,以便恢复速度更快。只要您的自定义全局包文件夹在开始之前为空,那么它将仅包含您的解决方案使用的包。

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

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

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

长话短说

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

  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文件(Get-ChildItem .\globalPackagesFolder\ -Recurse -Filter *.nupkg | Copy-Item -Destination .\nupkgs\如果使用 powershell)复制到用于传输到脱机计算机的设备。您可以(应该?)将.nupkgs 复制到平面文件夹中。
  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)。


mis*_*der 5

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

例子:

nuget install NUnit -Version 3.11.0 -OutputDirectory c:\packages
Run Code Online (Sandbox Code Playgroud)

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

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