2016-02-04 56 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