【问题标题】:.Net Core Unexpected NuGet Behavior.Net Core 意外的 NuGet 行为
【发布时间】:2016-02-04 18:16:23
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我没有在这台机器上安装 dotnet,但如果我没记错的话,dotnet new 创建的应用程序引用了NETStandard.Library,这是一个具有很多依赖项的“伞”包。您可以将其替换为您的应用所需的 System.* 依赖项,这样您在恢复时将获得更少的包。

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

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

    【讨论】:

    • 我认为重要的是要注意,在 .NET Core 中,所有依赖项都是可传递的。这意味着如果你在你的应用中包含一个包,你也包含了你的依赖所依赖的所有包。就像那个包(如标准库或 Asp.NET MVC 包)可以导入完整的应用程序模型或基础库。有龙:)
    【解决方案2】:

    软件包安装到%userprofile%\.nuget\packages 用于缓存目的。由于 Microsoft 正朝着将所有内容都打包(System.* 等)的方向发展,因此每次创建新项目时不要下载包是有意义的。

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 2016-05-14
      • 2017-02-24
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 2020-05-14
      相关资源
      最近更新 更多