.Net核心意外的NuGet行为

时间:2016-02-04 18:16:24

标签: .net windows nuget windows-10 .net-core

installed .net core from this site并按照测试“hello world”控制台应用程序的三步说明进行操作:

dotnet new
dotnet restore
dotnet run

一切正常,控制台应用程序成功运行。

然而,restore步骤做了两件意想不到的事情。首先,它将包恢复到NuGet的全局包文件夹(%userprofile%\.nuget\packages)。这种全局安装以前从未成为NuGet的默认行为。当然,如果dotnet restore在内部使用nuget.exe ......这种行为可能是由于缺少Visual Studio解决方案文件。

但是,这只是强调了第二个意外行为。 restore操作将85个软件包安装到全局NuGet软件包文件夹中。实际上,示例控制台应用程序不需要所有这些包。

看起来,这与.Net Core所声称的完全矛盾。

例如,对于这个简单的“hello world”控制台应用程序,以下是一些已安装的软件包:

  • runtime.win7.System.Net.Sockets
  • System.Globalization.Calendars
  • System.Linq的

因此,毫无疑问简单的'hello world'控制台应用程序的含义,这是整个程序:

using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

我的预期是示例控制台应用程序所需的软件包数量介于0和3-ish之间。再次,根据.Net Core的说法,我预计NuGet软件包将在本地安装 - 与示例控制台应用程序本身位于同一文件夹中。

有人可以澄清一下为什么或如何这种行为与.Net Core的主张不矛盾?

2 个答案:

答案 0 :(得分:1)

我没有在此计算机上安装dotnet,但是,如果我没记错的话,dotnet new创建的应用引用了NETStandard.Library这是一个"保护"包含很多依赖项的包。您可以将其替换为您的应用所需的System.*依赖项,并在恢复时获得更少的包。

如果您的应用程序依赖于X包,那么它可能会恢复超过X,因为它还需要带来这些包的所有依赖关系。这就是为什么你看到很多包被恢复的原因。

如果要在本地安装软件包,可以在运行dotnet restore时指定packages文件夹,然后为运行时设置NUGET_PACKAGES环境变量。

答案 1 :(得分:0)

将软件包安装到%userprofile%\.nuget\packages以进行缓存。随着微软逐渐将所有东西都变成一个软件包(System。*等),每次创建一个新项目时都不会下载软件包。

如果查看NuGet上的runtime.win7.System.Net.Sockets包,您将看到对System.Private.Networking的依赖。反过来,在很多包装上都有dependency

enter image description here

安装的软件包可能与这些软件包匹配。