我想知道我们是否应该在代码库中跟踪node_modules,或者在检查代码时进行npm安装?
ny6fqffe1#
模块详细信息存储在packages.json中,这就足够了。不需要签入node_modules。人们过去常常在版本控制中存储node_modules来锁定模块的依赖关系,但对于npm shrinkwrap,这不再需要了。这一点的另一个理由,正如@ChrisCM在评论中写道:同样值得注意的是,任何涉及原生扩展的模块都不能在架构间工作,需要重新构建。为不将它们包含在repo中提供具体的理由。
packages.json
node_modules
ulmd4ohb2#
我建议不要检入node_modules,因为例如,像node-sass和nectomJS这样的包,它们会为当前系统安装适当的二进制文件。这意味着如果一个Dev在Linux上运行npm install并检入node_modules -它将不适用于另一个在Windows上克隆存储库的Dev。
npm install
最好检查npm install下载的tarball并指向npm-shrinkwrap.json。您可以使用shrinkpack自动执行此过程。
npm-shrinkwrap.json
puruo6ea3#
这个主题很老了,我明白。但是由于npm生态系统的变化,我错过了这里提供的参数的一些更新。我总是建议不要将node_modules置于版本控制之下。几乎所有这样做的好处都在接受答案的上下文中列出,到目前为止都已经过时了。1.已经发布的包不能再轻易从npm registry中撤销了。所以你不必担心失去你的项目之前依赖的依赖。1.将package-json.lock文件放在MySQL中有助于频繁更新依赖项,可能会导致不同的设置,尽管依赖于相同的package.json文件。因此,在使用离线构建工具的情况下,将node_modules放入MySQL可能被认为是唯一符合条件的用例。然而,node_modules通常增长得非常快。任何更新都会更改很多文件。这会以不同的方式影响存储库。如果你真的考虑长期影响,这可能也是一个障碍。像svn这样的集中式目录需要在网络上传输提交和 checkout 的文件,这在 checkout 或更新node_modules文件夹时会非常慢.当使用git时,大量的额外文件会立即污染存储库。请记住,git不会跟踪任何文件版本之间的差异,但是只要有一个字符发生变化,就会存储文件的任何版本的副本。对任何依赖项的每次更新都会导致另一个大的更改。由于这会影响备份和远程备份,因此您的git存储库将迅速变得巨大。同步。如果你决定稍后从git仓库中删除node_modules,由于历史原因,它仍然是它的一部分。如果你已经将git仓库分发到某个远程服务器(例如用于备份),清理它是另一个痛苦且容易出错的任务。因此,如果您关心高效的流程并喜欢保持“小”,我宁愿使用单独的工件存储库,如Nexus/Artifactory(或只是一些带有ZIP存档的HTTP服务器),提供一些先前获取的依赖项集供下载。
lbsnaicq4#
不使用源代码控制跟踪node_modules是正确的选择,因为一些NodeJS模块,如MongoDB NodeJS驱动程序,使用NodeJS C++加载项。这些加载项在运行npm install命令时编译。因此,当您跟踪node_modules目录时,您可能会意外提交操作系统特定的二进制文件。
lbsnaicq5#
我同意ivoszz的观点,即检查node_modules文件夹有时是有用的,但是...
情景1:
一种情况是:您使用的是从npm中删除的包。如果您的node_modules文件夹中有所有的模块,那么您就不会有问题。如果您的package.json文件夹中只有包名,那么您就无法再获取它。如果一个包的发布时间不到24小时,那么您可以轻松地将其从npm中删除。如果它的发布时间超过24小时,那么您需要与他们联系。但是:如果您连络支援人员,他们会检查移除该版本的套件是否会中断任何其他安装。如果是,我们将不会移除。阅读更多所以这种可能性很低,但有第二种情况...
情景2:
另一种情况是:您开发了一个企业版软件或一个非常重要的软件,并在包中编写了.json:
"dependencies": { "studpid-package": "~1.0.1" }
字符串您可以使用该封装的方法function1(x)。现在,studpid-package的开发人员将方法function1(x)重命名为function2(x),他们犯了一个错误......他们将包的版本从1.0.1更改为1.1.0。这是一个问题,因为当您下次调用npm install时,您将接受版本1.1.0,因为您使用了波浪号("studpid-package": "~1.0.1")。现在调用function1(x)可能会导致错误和问题。"但是"将整个node_modules文件夹(通常超过100 MB)推送到仓库中会占用您的内存空间。与数百MB(package.json & node_modules)相比,只有几KB(仅package.json)......请考虑一下。如果出现以下情况,您可以/应该考虑一下:
function1(x)
function2(x)
1.0.1
1.1.0
"studpid-package": "~1.0.1"
在以下情况下,在99.9%的情况下,您不需要**发布node_modules文件夹:
如果您不希望node_modules在您的存储库中,只需创建一个.gitignore文件并添加行node_modules。
.gitignore
2mbi3lxu6#
我想提供一个中间的选择。1.不要在git中添加node_modules。1.使用一个package-lock.json文件来确定你的依赖版本。1.在您的CI或发布过程中,当您发布一个版本时,请复制node_modules文件夹并备份(例如在云存储中)。在极少数情况下,您无法访问NPM(或您使用的其他注册表)或NPM中的特定软件包,您可以拥有node_modules的副本,并且可以继续工作,直到您恢复访问。
package-lock.json
km0tfn4u7#
还有一件事需要考虑:签入node_modules使得使用dependencies和devDependencies之间的差异变得更加困难/不可能。但另一方面,可以说将经过测试的完全相同的代码推向生产是令人放心的-因此包括devDependencies。
dependencies
devDependencies
zpf6vheq8#
如果在package.json中提到依赖项,则不需要签入node_modules。任何其他程序员都可以通过执行npm install来获取它,并且npm足够智能,可以将node_modules置于项目的工作目录中。
y3bcpkx19#
答案并不像Alberto Zaccagni suggests那么简单。如果你开发应用程序(尤其是企业应用程序),在你的git repo中包含node_modules是一个可行的选择,你选择哪种替代方案取决于你的项目。因为他很好地反对node_modules,所以我将集中讨论它们的论点。想象一下,你刚刚完成了企业应用程序,你将不得不支持它3-5年。你肯定不想依赖于某人的npm模块,明天可能会消失,你不能再更新你的应用程序。或者你有你的私人模块,不能从互联网上访问,你不能在互联网上构建你的应用程序。或者也许你不想依赖于你的最终构建在npm服务出于某种原因。你可以在这篇Addy Osmani的文章中找到优点和缺点(虽然它是关于Bower的,但情况几乎相同)。我将引用Bower主页和Addy的文章结束:如果您创作的软件包不是供其他人使用的(例如,您正在构建Web应用程序),则应始终将已安装的软件包检入源代码控制。
9条答案
按热度按时间ny6fqffe1#
模块详细信息存储在
packages.json
中,这就足够了。不需要签入node_modules
。人们过去常常在版本控制中存储
node_modules
来锁定模块的依赖关系,但对于npm shrinkwrap,这不再需要了。这一点的另一个理由,正如@ChrisCM在评论中写道:
同样值得注意的是,任何涉及原生扩展的模块都不能在架构间工作,需要重新构建。为不将它们包含在repo中提供具体的理由。
ulmd4ohb2#
我建议不要检入node_modules,因为例如,像node-sass和nectomJS这样的包,它们会为当前系统安装适当的二进制文件。
这意味着如果一个Dev在Linux上运行
npm install
并检入node_modules -它将不适用于另一个在Windows上克隆存储库的Dev。最好检查npm install下载的tarball并指向
npm-shrinkwrap.json
。您可以使用shrinkpack自动执行此过程。puruo6ea3#
这个主题很老了,我明白。但是由于npm生态系统的变化,我错过了这里提供的参数的一些更新。
我总是建议不要将node_modules置于版本控制之下。几乎所有这样做的好处都在接受答案的上下文中列出,到目前为止都已经过时了。
1.已经发布的包不能再轻易从npm registry中撤销了。所以你不必担心失去你的项目之前依赖的依赖。
1.将package-json.lock文件放在MySQL中有助于频繁更新依赖项,可能会导致不同的设置,尽管依赖于相同的package.json文件。
因此,在使用离线构建工具的情况下,将node_modules放入MySQL可能被认为是唯一符合条件的用例。然而,node_modules通常增长得非常快。任何更新都会更改很多文件。这会以不同的方式影响存储库。如果你真的考虑长期影响,这可能也是一个障碍。
像svn这样的集中式目录需要在网络上传输提交和 checkout 的文件,这在 checkout 或更新node_modules文件夹时会非常慢.
当使用git时,大量的额外文件会立即污染存储库。请记住,git不会跟踪任何文件版本之间的差异,但是只要有一个字符发生变化,就会存储文件的任何版本的副本。对任何依赖项的每次更新都会导致另一个大的更改。由于这会影响备份和远程备份,因此您的git存储库将迅速变得巨大。同步。如果你决定稍后从git仓库中删除node_modules,由于历史原因,它仍然是它的一部分。如果你已经将git仓库分发到某个远程服务器(例如用于备份),清理它是另一个痛苦且容易出错的任务。
因此,如果您关心高效的流程并喜欢保持“小”,我宁愿使用单独的工件存储库,如Nexus/Artifactory(或只是一些带有ZIP存档的HTTP服务器),提供一些先前获取的依赖项集供下载。
lbsnaicq4#
不使用源代码控制跟踪
node_modules
是正确的选择,因为一些NodeJS模块,如MongoDB NodeJS驱动程序,使用NodeJS C++加载项。这些加载项在运行npm install
命令时编译。因此,当您跟踪node_modules
目录时,您可能会意外提交操作系统特定的二进制文件。lbsnaicq5#
我同意ivoszz的观点,即检查node_modules文件夹有时是有用的,但是...
情景1:
一种情况是:您使用的是从npm中删除的包。如果您的node_modules文件夹中有所有的模块,那么您就不会有问题。如果您的package.json文件夹中只有包名,那么您就无法再获取它。如果一个包的发布时间不到24小时,那么您可以轻松地将其从npm中删除。如果它的发布时间超过24小时,那么您需要与他们联系。但是:
如果您连络支援人员,他们会检查移除该版本的套件是否会中断任何其他安装。如果是,我们将不会移除。
阅读更多
所以这种可能性很低,但有第二种情况...
情景2:
另一种情况是:您开发了一个企业版软件或一个非常重要的软件,并在包中编写了.json:
字符串
您可以使用该封装的方法
function1(x)
。现在,studpid-package的开发人员将方法
function1(x)
重命名为function2(x)
,他们犯了一个错误......他们将包的版本从1.0.1
更改为1.1.0
。这是一个问题,因为当您下次调用npm install
时,您将接受版本1.1.0
,因为您使用了波浪号("studpid-package": "~1.0.1"
)。现在调用
function1(x)
可能会导致错误和问题。"但是"
将整个node_modules文件夹(通常超过100 MB)推送到仓库中会占用您的内存空间。与数百MB(package.json & node_modules)相比,只有几KB(仅package.json)......请考虑一下。
如果出现以下情况,您可以/应该考虑一下:
在以下情况下,在99.9%的情况下,您不需要**发布node_modules文件夹:
如果您不希望node_modules在您的存储库中,只需创建一个
.gitignore
文件并添加行node_modules
。2mbi3lxu6#
我想提供一个中间的选择。
1.不要在git中添加
node_modules
。1.使用一个
package-lock.json
文件来确定你的依赖版本。1.在您的CI或发布过程中,当您发布一个版本时,请复制node_modules文件夹并备份(例如在云存储中)。
在极少数情况下,您无法访问NPM(或您使用的其他注册表)或NPM中的特定软件包,您可以拥有node_modules的副本,并且可以继续工作,直到您恢复访问。
km0tfn4u7#
还有一件事需要考虑:签入
node_modules
使得使用dependencies
和devDependencies
之间的差异变得更加困难/不可能。但另一方面,可以说将经过测试的完全相同的代码推向生产是令人放心的-因此包括
devDependencies
。zpf6vheq8#
如果在package.json中提到依赖项,则不需要签入node_modules。任何其他程序员都可以通过执行npm install来获取它,并且npm足够智能,可以将node_modules置于项目的工作目录中。
y3bcpkx19#
答案并不像Alberto Zaccagni suggests那么简单。如果你开发应用程序(尤其是企业应用程序),在你的git repo中包含node_modules是一个可行的选择,你选择哪种替代方案取决于你的项目。
因为他很好地反对node_modules,所以我将集中讨论它们的论点。
想象一下,你刚刚完成了企业应用程序,你将不得不支持它3-5年。你肯定不想依赖于某人的npm模块,明天可能会消失,你不能再更新你的应用程序。
或者你有你的私人模块,不能从互联网上访问,你不能在互联网上构建你的应用程序。或者也许你不想依赖于你的最终构建在npm服务出于某种原因。
你可以在这篇Addy Osmani的文章中找到优点和缺点(虽然它是关于Bower的,但情况几乎相同)。我将引用Bower主页和Addy的文章结束:
如果您创作的软件包不是供其他人使用的(例如,您正在构建Web应用程序),则应始终将已安装的软件包检入源代码控制。