5

我非常了解Visual Studio 2010,当我开始使用Visual Studio 2012 时,我注意到它会自动使用我以前没有使用过的Nuget,我只知道它是一个从互联网上获取库的包管理器。例如,当我创建一个空的 ASP.NET MVC 4 项目时,该项目将包含一个包含 11 个条目的 packages.config 文件,并且在解决方案文件夹下将有一个包含 11 个库的 packages 目录。

这是我没有得到的东西。

第一个可能是一个反问,但为什么呢?即使是一个空的项目也包含 10+ MB 的包,即使我不使用任何包,看起来也很愚蠢。

例如,包下有一个 System.Web.Mvc.dll。但它也在我的 GAC 中,我认为它是 .NET 框架的一个组成部分。两者都是完全相同的版本 (4.0.20710.0),但文件不同。为什么我的项目使用 Nuget 的这个 DLL 而不是 .NET/GAC?为什么文件不一样?如果我将我的项目部署到 IIS 服务器,也会有这个 DLL 的副本,因此将这些 DLL 作为项目的一部分似乎完全没用。更不用说它使我的部署包臃肿。

顺便说一下膨胀。有一个对 Newtonsoft.Json.4.5.11 的引用,它本身有 8+ MB,因为它包含 .NET 2、3.5、4、Silverlight 和任何相同版本的东西,总共 9 个。当我创建我的项目时,我指定我想使用 .NET 4.5,所以我很困惑为什么所有这些东西都在我的硬盘上。

最后,这个 Nuget 东西与我的项目或解决方案有什么关系?我在 VS 中看不到包文件夹,我在 .sln 文件中看不到任何提及它。该项目确实包含文件 packages.config,但它与构建过程没有任何关系,看起来像是死重。我问这个是因为如果有一些对 Nuget 的引用,我可以很容易地删除它,但是没有引用,所以我感到困惑。

4

2 回答 2

3

第一个可能是一个反问,但为什么呢?即使是一个空的项目也包含 10+ MB 的包,即使我不使用任何包,看起来也很愚蠢。

我完全同意你的观点。默认的项目模板很臃肿,有很多废话。

这就是我在启动新应用程序时总是使用 Empty ASP.NET 应用程序模板的原因。然后我在解决方案上启用 NuGet 包还原并手动安装我需要的所有包 -> ASP.NET MVC、Razor、...

例如,包下有一个 System.Web.Mvc.dll。但它也在我的 GAC 中,我认为它是 .NET 框架的一个组成部分。

不,它不是 .NET 的一部分。它是 Visual Studio 的一部分,也有单独的安装。如果未安装 ASP.NET MVC,则在服务器上不会有这样的程序集。

有一个对 Newtonsoft.Json.4.5.11 的引用,它本身有 8+ MB,因为它包含 .NET 2、3.5、4、Silverlight 和任何相同版本的东西,总共 9 个。当我创建我的项目时,我指定我想使用 .NET 4.5,所以我很困惑为什么所有这些东西都在我的硬盘上。

它是 NuGet 包的一部分,已下载到您的应用程序源代码所在的计算机上,但是当您发布应用程序时,只会部署和使用正确的版本。

最后,这个 Nuget 东西与我的项目或解决方案有什么关系?我在 VS 中看不到包文件夹,我在 .sln 文件中看不到任何提及它。

下载这些包的 NuGet 源在 Tools->Library Package Manager->Package Manager Settings/Package Sources 中配置。如此基础

于 2013-10-28T14:02:34.447 回答
2

MVC 和相关技术,如实体框架等,不包含在基本 .NET 程序集中。它们在设计上被中断,以允许在 .NET 发布周期之外进行独立开发。当然,这有点令人困惑,因为您倾向于获得这些包的新版本以及 .NET 的新版本(例如,ASP.NET 5 包括 MVC 5、Web Api 2 和 Entity Framework 6),但您可能会获得.NET 下一版本之前的 MVC 6、Web Api 3 或 Entity Framework 7。

包的大小是无关紧要的。当您实际发布项目时,仅包含必要的库和 DLL。.NET 其他版本的所有东西都只是兼容性(以防其他人使用不同版本构建他们的项目)。

默认的 MVC 项目包含很多包,但那是因为它实现了 OAuth 之类的东西,您不需要使用这些东西。如果您不使用这些功能,您可以随时删除这些包(假设您实际上已经更改了代码,因此它们实际上没有被使用)。您还可以生成一个空的 MVC 项目,它仍然不会没有包(MVC、实体框架等仍将包括在内),但您不会有其他杂项库。

不过,一般来说,不要关心包。一个设计良好的项目实际上最终会包含更多内容,因为您添加了依赖注入、映射等内容。这些是您应该自己做的事情:当没有完全开发时,它们是代码中的弱点,并且有许多优秀的包已经完成了正确的工作,并且针对错误等进行了同行评审。与 Nuget 的战斗将是一场失败的战斗,所以接受它并继续前进。

于 2013-10-28T16:10:00.877 回答