如何获取所有NuGet依赖项以进行离线安装

22

我有两台电脑,一台连接互联网,另一台则没有。

我想在离线电脑上安装一个 Nuget 包(Nuget.server)及其所有依赖项。不幸的是,仅下载包本身是不可能的,我必须手动下载所有依赖项,而这些依赖项有数十个。

我该如何在连接互联网的电脑上创建一个包含所有依赖项的包呢?

谢谢。

6个回答

38

我刚经历了这种痛苦,想要找到只使用NuGet CLI的解决方案。结果发现真的很简单:

> nuget.exe install <PACKAGENAME> -OutputDirectory <OUTPUTDIR>

关键在于-OutputDirectory开关,它使得CLI将指定的软件包安装到没有项目文件的目录中。运行该命令将下载软件包及其所有依赖项到输出目录中,每个软件包放入单独的子文件夹。然后您可以从输出目录中获取所有的.nupkg文件并进行必要的操作。

更新:正如Igand在评论中指出的那样,实际上不需要使用-OutputDirectory开关。如果省略该开关,nuget.exe将直接下载到当前文件夹。但最好不要将其下载到带有项目文件的文件夹中(除非这正是您想要的)。


1
不确定为什么还没有人点赞,但这正是我所需要的。没有第三方软件解决方案!谢谢 - CSCoder
2
谢谢!你的意思是从简单控制台运行,对吗?那么即使没有-OutputDirectory选项,包含包的目录也会被下载到nuget.exe目录中。我像这样使用它“nuget install NullGuard.Fody -Version 1.8.0”,其中名称和版本只是从nuget.org上给定包的信息中复制粘贴而来。 - Igand
@Igand,你说得完全正确,-OutputDirectory是不必要的。我想当我在寻找解决方案时可能把它和另一个问题混淆了。无论如何,由于我需要将下载的软件包上传到私有源,-OutputDirectory开关帮助我将所有下载的软件包和依赖项组织到它们自己的文件夹中,清晰地显示每个软件包所需的内容。 - Adrian Sanguineti
1
如果依赖项没有下载,请确保您指定了“-Framework”标志(例如:“-Framework netstandard2.0”)。 - Zar Shardan

13

我也有类似的需求,所以我创建了NuSave

缓存包含依赖项的单个NuGet包

nusave cache package "Newtonsoft.Json@12.0.3" --targetFrameworks ".NETStandard@1.0,.NETStandard@1.3" --cacheDir "C:\path\to\my-local-feed"

.csproj文件缓存多个NuGet包

nusave cache csproj "C:\path\to\project.csproj" --cacheDir "C:\path\to\my-local-feed"

.sln 文件中缓存多个 NuGet 包

nusave cache sln "C:\path\to\solution.sln" --cacheDir "C:\path\to\my-local-feed"

使用本地缓存离线还原和构建解决方案

cd C:\path\to\my-solution
dotnet restore --packages C:\path\to\my-local-feed
dotnet build --no-restore

你的项目应该如何恢复NuGet呢 :D - PKV
1
我已经完成了,手动下载,不多。谢谢,我会检查一下的。 - PKV
获取了包,但没有依赖项。不是很有用。 - GidiBloke

7
在具有互联网访问权限的计算机上,NuGet包(.nupkg)应该存储在本地机器缓存中。在Windows上,它位于类似以下目录的文件夹中:
C:\Users\YourUsername\.nuget\packages

因此,您应该能够将.nupkg文件从那里复制到没有互联网访问的计算机上。我会在该计算机上创建一个目录,并设置一个指向该目录的新包源。或者,您可以将.nupkg文件复制到本地机器缓存中,但请注意缓存中只能有200个NuGet包的限制。然后,您可以创建一个指向缓存的包源。


我没有找到Cache,但是看到一个目录,路径末尾有"v3-cache"。它里面装满了.DAT文件,而不是.nupkg文件。不确定答案是否需要更新或者我找错地方了。编辑: 看起来现在它们在C:\Users\yourName\.nuget\packages里了? - ruffin
1
是的,这个答案相当老了。NuGet包已经移动到另一个目录下了。https://learn.microsoft.com/en-us/nuget/Consume-Packages/managing-the-global-packages-and-cache-folders - Matt Ward
我认为这是绝对正确的想法。我从...\.nuget\packages中复制了所需的NuGet文件夹,将它们复制到“离线”工作站上的一个新目录中,在VS中设置了一个“本地”NuGet源,指向我复制它们的目录,然后一切就OK了。加一分! - ruffin

5
使用dotnet restore命令和--packages标志,将软件包下载到指定目录。
dotnet restore --packages <TargetDirectory> <ProjectPath>

参考:dotnet restore

指定还原包的目录。


2
虽然这段代码可能是解决方案,但包括解释真的有助于提高您的帖子质量。请记住,您正在回答未来读者的问题,而那些人可能不知道您的代码建议原因。 - colidyre
如果在回退位置中已经存在隐式包,则下载的内容不包括隐式包。您应该添加 /p:DisableImplicitNuGetFallbackFolder=true 来解决这个问题。来源 - MichaelM

3
略晚加入讨论,但我遇到了相同的问题。我在一家中等规模的离线软件开发公司工作。许多新的 NuGet 包拥有非常大的依赖关系树。手动遍历整个树并下载所需的全部包非常繁琐。最终,我编写了 NuGet 依赖项下载器。使用此工具,您可以提供要下载的包 ID(可选版本),选择是否允许预发行包,并单击“开始”按钮,它将拉取列出的包及其所有依赖项。例如,当我输入 "Microsoft.AspNet.Mvc" 并选择 "pre-release" 时,此工具将为 MVC 6.0 RC1 下载 158 个包。希望这能帮助那些在离线环境下工作的人。
GitHub 链接:https://github.com/StuffOfInterest/NuGetDependencyDownloader

0
在你的 csproj 文件中:
<Project Sdk="Microsoft.NET.Sdk">


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

或者使用带有所有程序集引用的dotnet publish


2
这有什么帮助? - Scott Hutchinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接