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

时间:2018-12-01 08:10:30

标签: cmd nuget nuget-package

是否有Windows命令将带有依赖项的Nuget软件包下载到文件夹,以便我可以将其传输到脱机计算机? 我的意思是说我可以给Nuget包命名的命令,它将把该包及其所有依赖项作为nupkg文件下载到一个文件夹中。

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

2 个答案:

答案 0 :(得分:1)

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

示例:

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

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

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

答案 1 :(得分:1)

如果您正在寻找仅需要少量脚本编写的预先构建的解决方案,则我不知道这种工具。但是,我认为您要实现自己的目标并不困难。下面的答案很长,因为我要提供很多细节,而不是要使它变得更加困难。

第1步:收集包裹

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

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

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

另一个选择是在执行还原之前先创建一个nuget.config文件和specify a custom globalPackagesFolder。如果这样做,建议您也将配置文件的全局软件包文件夹添加为package source,这样可以更快地进行还原。只要您的自定义全局软件包文件夹在开始之前为空,那么它将仅包含您的解决方案使用的软件包。

步骤2:选择希望脱机计算机获取软件包的方式

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

因此,我建议仅复制.nupkg文件,然后在离线计算机上创建一个nuget.config文件,该文件会将您复制所有.nupkg的文件夹添加为{ {3}}。此nuget.config文件不需要在您的存储库中。您可以利用NuGet分层累积配置并在脱机计算机的根目录上创建此nuget.config的事实(或者,如果将所有存储库克隆到单个位置,则可以将其放置在此处),因为这只是必需的通过离线计算机。只要您的项目中没有一个清除nuget.config部分的packageSources,那么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 install my.slnmsbuild /t:restore my.slndotnet 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 the nupkg`s)。