我们是否应在版本控制中包含Nuget PACKAGE文件夹?


68

我想知道

在C#或VB.NET项目中,我们应将PACKAGE文件夹(在我的项目的根目录中创建的包含nupkg文件和其他内容的块包文件夹)添加到我们的源代码控制存储库(例如,Git)中。


绝对,因为这些文件是你的代码和您的项目将不建立,没有他们的一部分。
Sharky

不久前,我在SO上也提出了类似的问题。您也可以在此处寻找答案:stackoverflow.com/questions/1710027/… :)
cwap

我想知道为什么Maven世界中没有人问“我们应该在版本控制中包含3rd party库”。为不提交库找到一些可靠的论据,尽管不是很令人信服。
晃龙

Answers:


28

很多时间过去了,NuGet改变了,所以这是一个新的答案。

NuGet不再在您的源结构内创建一个packages文件夹。而是在您的用户目录中(%HOME%\.nuget\packages具体来说)有一个目录,其中放置了所有下载的软件包,而项目仅引用了这些软件包。

因此,这几天的简单答案是不,您不应该。如果您担心需要消失的软件包,则应创建一个单独备份的本地NuGet镜像。


6
我使用的是VS2015(考虑到VS2017在您编写此答案之前三天就已发布),并且程序包文件夹位于我的解决方案根目录中。我很好奇NuGet的更改方式和时间。
Teejay

NuGet随版本3进行了更改,该版本在VS2015期间的某个时间带外发布。
塞巴斯蒂安·雷德尔

我刚刚检查了我的工作计算机,发现软件包在您提到的地方。但是在我的家用计算机上,它们位于项目目录中。两者都在VS2015上(专业@工作,社区@家庭),而家庭一个是最近安装的……这很奇怪。
Teejay

12
上周刚刚安装了VS 2017,昨天创建了一个新项目,我的项目中有一个软件包目录。
杰里米

2
您为CI做什么?使其一次又一次下载所有nuget软件包吗?(TBH:我个人,我不清楚我的想法是什么)
Tomer W,

50

这取决于。

查看Bart van Ingen Schenau的答案,以确定是否有可能完全忽略该packages文件夹。

基本上:是的,NuGet的设计目的是使您可以忽略该packages文件夹,如果丢失,NuGet将从互联网上提取所有内容。

但是您应该忽略它吗?我说:这要看情况。
IMO这是一个问题:“在软件包存储库不可用的情况下,我们可以继续工作吗”(临时还是永久)

对于我的个人OSS项目,我将packages所有文件夹都忽略了。
当nuget.org处于离线状态时,我将等待并继续另一天。

但这在工作中有所不同。
当然,您可能仍然在某些计算机上本地拥有这些软件包,但是由于构建服务器无法访问nuget.org,在构建中断时是否可以节省一些值得麻烦的空间?

我们认为空间很便宜,并且我们不希望麻烦,这就是为什么要将packages文件夹提交到源代码管理。


1
nuget.org多久不可用?
Bartosz

4
可能不是很经常。但是也许我应该说“无法到达”而不是“离线”。几年前,我们在工作中发生了一起事故,其中一台挖掘机意外切断了通往我们大楼的互联网电缆。花了一天多的时间修理。如果我们依靠nuget.org,我们将无法构建我们的项目。(是的,我知道,如今,NuGet在本地缓存程序包……但不是那时)
Christian Specht

我要说的是,当您不检入packages文件夹时,构建时间会更长,因为在恢复软件包期间,它花费了大部分构建时间来检索软件包。
AaronLS

29

源代码控制存储库中的内容的基本规则是,将与项目相关的所有内容存储在此处,您需要能够构建,测试,部署和执行该项目,并且不能从存储库中已存在的项目中生成这些项目。

换句话说,如果您可以丢弃PACKAGE文件夹及其内容而又不影响您的能力,则可以继续进行项目工作(构建过程可能会花费更长的时间,但是您不必自己动手安装任何东西),则该文件夹可以安全地从存储库中删除。
如果该文件夹包含第三方软件包,这些软件包可能需要很长时间才能下载,或者可能变得不可用,则这可能是无论如何将它们添加到资源库的原因。


20
我要补充一点,您应该妥善保存项目中使用的任何第三方代码的版本,以防第三方项目被删除,托管它的站点消失等。在版本控制存储库中可以这样做。如果需要,这还使您有机会回滚到该代码的先前版本。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.