2016-02-04 52 views
0

installed .net core from this site,随后用于测试的“Hello World”控制台应用程序的三个步骤的说明:对.NET核心意外的NuGet行为

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的主张不矛盾吗?

回答

0

该软件包安装到%userprofile%\.nuget\packages用于高速缓存目的。随着微软正在将所有东西都变成一个软件包(System。*等),每次创建新项目时都不要下载软件包。

如果您查看NuGet上的runtime.win7.System.Net.Sockets程序包,您将看到对System.Private.Networking的依赖关系。在几个软件包上又有一个dependency

enter image description here

很可能是安装的软件包进行匹配。

1

我没有在这台机器上安装dotnet,但是,如果我没有记错的话,由dotnet new创建的应用引用NETStandard.Library这是一个“伞”包,具有很多依赖性。您可以用您的应用程序需要的System.*依赖项替换它,并且在还原时您将获得更少的软件包。

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

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

+0

我认为值得注意的是,在.NET Core中,所有的依赖关系都是可传递的。这意味着如果您在应用程序中包含软件包,则还会包含依赖关系所依赖的所有软件包。像一个包(如标准库或Asp.NET MVC包)一样,可以导入完整的应用程序模型或基础库。有龙:) – Thomas