我installed .net core from this site并按照测试"hello world"控制台应用程序的三步说明操作:
dotnet new
dotnet restore
dotnet run
一切正常,控制台应用程序成功运行 .
然而, restore
步骤做了两件意想不到的事情 . 首先,它将包恢复到NuGet的全局包文件夹( %userprofile%\.nuget\packages
) . 这种 global install 以前从未成为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 回答
我没有在这台机器上安装dotnet但是,如果我没记错的话,
dotnet new
创建的应用程序引用NETStandard.Library
这是一个有很多依赖关系的"umbrella"包 . 您可以将其替换为您的应用程序所需的System.*
依赖项,并且您将在还原时获得更少的程序包 .如果你的应用程序依赖于X包,那么它可能会恢复超过X,因为它还需要带来这些包的所有依赖关系 . 这就是为什么你看到很多软件包恢复的原因 .
如果要在本地安装软件包,可以在运行
dotnet restore
时指定packages文件夹,然后为运行时设置NUGET_PACKAGES
环境变量 .软件包安装到
%userprofile%\.nuget\packages
用于缓存目的 . 随着微软逐渐将所有东西都变成一个包(系统 . *等),每次创建一个新项目时都不下载包是有意义的 .如果查看NuGet上的runtime.win7.System.Net.Sockets包,您将看到对System.Private.Networking的依赖 . 反过来,在很多包装上都有dependency .
安装的软件包可能与这些软件包匹配 .