【问题标题】:Command to download a Nuget package with all dependencies to a folder将具有所有依赖项的 Nuget 包下载到文件夹的命令
【发布时间】:2018-12-01 08:10:29
【问题描述】:

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

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

【问题讨论】:

    标签: cmd nuget nuget-package


    【解决方案1】:

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

    示例:

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

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

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

    【讨论】:

      【解决方案2】:

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

      第 1 步:收集包裹

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

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

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

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

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

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

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

      TL;DR

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

      1. 在连接 Internet 的计算机上,创建一个 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. .nupkgs 从设备复制到专用于您的离线提要的文件夹中。
      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)。

      【讨论】:

      • 我编辑了我的答案,因为我找到了一种使用命令行工具完成大部分所需工作的方法。
      • "恢复所有项目 (nuget.exe restore my.sln)" 这只是告诉我“所有项目都是最新的,可以恢复。”有没有办法在新目录中执行此操作? “globalPackagesFolder”在哪里?我应该在 1. 中做些什么来替换 <clear />
      • 如果您仔细按照我的说明进行操作,这些包位于名为 usedPackages 的文件夹中。在“TL;DR”步骤中,第 1 步,在 nuget.config 中设置 globalPackagesFolder 配置,就是发生这种情况的地方。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 2019-06-14
      • 1970-01-01
      • 2017-08-03
      • 2012-03-14
      • 1970-01-01
      • 2011-09-10
      相关资源
      最近更新 更多