【问题标题】:Nuget.exe and NuGet Package Manager resolve different dependenciesNuget.exe 和 NuGet 包管理器解决不同的依赖关系
【发布时间】:2019-07-19 16:03:50
【问题描述】:

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

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

当我下载相同的软件包以进行离线安装时,nuget.exe 获取 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 离线安装所需的正确包?

【问题讨论】:

    标签: c# nuget offline


    【解决方案1】:

    以下是我如何将正确的依赖项安装到我的离线系统:

    在线系统上

    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;
        }
    

    【讨论】:

      【解决方案2】:

      如果您在 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 2020-03-15
        • 2019-11-05
        • 2013-11-09
        • 1970-01-01
        • 2015-03-29
        相关资源
        最近更新 更多