Nuget.exe和NuGet程序包管理器解决了不同的依赖性

时间:2019-07-19 16:03:50

标签: c# nuget offline

我想将OPCFoundation.NetStandard.Opc.Ua版本1.4.355.26(及其所有依赖项)安装到脱机计算机上。我的在线和离线计算机都在运行Visual Studio 2019 16.1.3

当我使用OPCFoundation.NetStandard.Opc.Ua安装1.4.355.26版本NuGet Package Manager时,它会安装许多依赖项,包括Libuv.1.10.0。查看屏幕截图:

NuGet Package Manager resolves Libuv.1.10.0

当我下载相同的软件包进行脱机安装时,nuget.exe会获取Libuv.1.9.2。查看屏幕截图:

nuget.exe resolves Libuv.1.9.2

C:\Users\cstankevitz\Downloads>nuget.exe install OPCFoundation.NetStandard.Opc.Ua
Feeds used:
  https://api.nuget.org/v3/index.json
  C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\

Installing package 'OPCFoundation.NetStandard.Opc.Ua' to 'C:\Users\cstankevitz\Downloads'.
  GET https://api.nuget.org/v3/registration3-gz-semver2/opcfoundation.netstandard.opc.ua/index.json
  OK https://api.nuget.org/v3/registration3-gz-semver2/opcfoundation.netstandard.opc.ua/index.json 558ms


Attempting to gather dependency information for package 'OPCFoundation.NetStandard.Opc.Ua.1.4.355.26' with respect to project 'C:\Users\cstankevitz\Downloads', targeting 'Any,Version=v0.0'
Gathering dependency information took 16.89 sec
Attempting to resolve dependencies for package 'OPCFoundation.NetStandard.Opc.Ua.1.4.355.26' with DependencyBehavior 'Lowest'
Resolving dependency information took 0 ms
Resolving actions to install package 'OPCFoundation.NetStandard.Opc.Ua.1.4.355.26'
Resolved actions to install package 'OPCFoundation.NetStandard.Opc.Ua.1.4.355.26'
Retrieving package 'Libuv 1.9.2' from 'nuget.org'.
...

当然,当我将下载的软件包带到脱机计算机上并使用Visual Studio 2019 NuGet Package Manager安装它们时,安装失败,因为Libuv.1.10.0不可用。

如何获得nuget.exe(或任何其他工具)来下载NuGet Package Manager进行脱机安装所需的正确软件包?

2 个答案:

答案 0 :(得分:0)

如果您在VS中查看“预览更改”对话框的输出,则所有Microsoft.AspNetCore软件包的版本均为2.0.1,而运行nuget.exe的软件包的版本为1.1.x。如果您look at OPCFoundation.NetStandard.Opc.Ua on nuget.org并展开依赖关系,则会看到它与net46netstandard2.0的1.1程序包具有依赖关系,而对netstandard2.0的2.0依赖项具有依赖关系。

由此我可以推断出您的项目正在使用netcoreapp2.0netstandard2.0或更高版本,而nuget.exe可能正在使用某些.NET Framework进行依赖。

关于获取项目实际使用的相同软件包的方法,我过去已经多次回答了这个问题,通常我会link to the first time I answered it

答案 1 :(得分:0)

这是我如何为离线系统安装正确的依赖项:

在在线系统上

  1. 获取https://github.com/StuffOfInterest/NuGetDependencyDownloader的来源
  2. 编辑PackageTools.cs并修改函数GetRangedPackageVersion,使其包含下面的代码。这是修复“错误”所必需的,在该错误中,当有较新的软件包可用时,不会下载较旧的软件包-但在下面的步骤9中将需要较旧的软件包。
  3. 编译并运行NuGetDependencyDownloader以下载软件包及其依赖项
  4. 将软件包复制到外部驱动器

在离线系统上

  1. 将软件包复制到离线系统(在我的示例中为c:\Work\2019-07018 Nuget Offline\
  2. 编辑Nuget Package Manager | Package Sources的选项。添加指向步骤5中使用的目录的源。Specify Local Package Source Screenshot
  3. 运行Nuget Package Manager
  4. 指定您在步骤6中创建的Package sourceSpecify package source screenshot
  5. 安装软件包
  6. 请注意,它似乎已安装,但实际上没有任何反应。它正在尝试在线联系某些东西(长时间超时后会失败)。对每个依赖项重复此操作。通过断开所有接口(拔下电缆等)来加速故障。
    private IPackage GetRangedPackageVersion(IQueryable<IPackage> packages, IVersionSpec versionSpec)
    {
      packages = packages.Where(o => o.Version == versionSpec.MinVersion);

      IPackage package = packages
          .OrderByDescending(o => o.Version)
          .FirstOrDefault();

      return package;
    }