对.NET核心意外的NuGet行为
我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的主张不矛盾吗?
该软件包安装到%userprofile%\.nuget\packages
用于高速缓存目的。随着微软正在将所有东西都变成一个软件包(System。*等),每次创建新项目时都不要下载软件包。
如果您查看NuGet上的runtime.win7.System.Net.Sockets程序包,您将看到对System.Private.Networking的依赖关系。在几个软件包上又有一个dependency。
很可能是安装的软件包进行匹配。
我没有在这台机器上安装dotnet,但是,如果我没有记错的话,由dotnet new
创建的应用引用NETStandard.Library
这是一个“伞”包,具有很多依赖性。您可以用您的应用程序需要的System.*
依赖项替换它,并且在还原时您将获得更少的软件包。
如果您的应用程序依赖于X包,那么它可能会比X还原更多,因为它需要将这些包的所有依赖关系也带回来。这就是为什么你看到很多包被恢复。
如果要在本地安装软件包,则可以在运行dotnet restore
时指定软件包文件夹,然后设置运行时的NUGET_PACKAGES
环境变量。
我认为值得注意的是,在.NET Core中,所有的依赖关系都是可传递的。这意味着如果您在应用程序中包含软件包,则还会包含依赖关系所依赖的所有软件包。像一个包(如标准库或Asp.NET MVC包)一样,可以导入完整的应用程序模型或基础库。有龙:) – Thomas