我想知道我们是否应该跟踪node_modules在我们的repo或做一个npm安装时检查出的代码?


当前回答

模块详细信息存储在包中。Json就足够了。不需要签入node_modules。

人们习惯将node_modules存储在版本控制中,以锁定模块的依赖关系,但有了npm shrinkwrap,就不再需要这种方法了。

另一个理由是,@ChrisCM在评论中写道:

同样值得注意的是,任何涉及本机扩展的模块都不能在体系结构之间工作,需要重新构建。提供不将它们包括在回购中的具体理由。

其他回答

模块详细信息存储在包中。Json就足够了。不需要签入node_modules。

人们习惯将node_modules存储在版本控制中,以锁定模块的依赖关系,但有了npm shrinkwrap,就不再需要这种方法了。

另一个理由是,@ChrisCM在评论中写道:

同样值得注意的是,任何涉及本机扩展的模块都不能在体系结构之间工作,需要重新构建。提供不将它们包括在回购中的具体理由。

我看这个话题已经很老了。但由于npm生态系统的情况发生了变化,我错过了这里提供的一些参数的更新。

我总是建议不要将node_modules置于版本控制之下。在公认的答案中列出的几乎所有这样做的好处到目前为止都已经过时了。

已经发布的包不能轻易地从npm注册表中撤销了。因此,您不必担心失去项目以前所依赖的依赖项。 把package-json。VCS中的lock文件有助于频繁更新依赖关系,虽然依赖于同一个包,但可能会导致不同的设置。json文件。

因此,在使用脱机构建工具的情况下,将node_modules放入VCS中可能被认为是剩下的唯一合格的用例。然而,node_modules通常增长得很快。任何更新都会改变很多文件。这以不同的方式影响着存储库。如果你真的考虑到长期影响,这也可能是一个障碍。

像svn这样的集中式VCS需要通过网络传输提交和签出的文件,这在签出或更新node_modules文件夹时将会非常慢。

When it comes to git this high number of additional files will instantly pollute the repository. Keep in mind that git isn't tracking differences between versions of any file, but is storing copies of either version of a file as soon as a single character has changed. Every update to any dependency will result in another large changeset. Your git repository will quickly grow huge because of this affecting backups and remote synchronization. If you decide to remove node_modules from git repository later it is still part of it for historical reasons. If you have distributed your git repository to some remote server (e.g. for backup) cleaning it up is another painful and error-prone task you'd be running into.

因此,如果您关心高效的流程,并且喜欢保持事情“小”,我宁愿使用单独的工件存储库,如Nexos repository(或只是一些带有ZIP存档的HTTP服务器),提供一些先前获取的依赖集供下载。

不使用源代码控制跟踪node_modules是正确的选择,因为一些NodeJS模块,如MongoDB NodeJS驱动程序,使用NodeJS c++附加组件。这些附加组件是在运行npm install命令时编译的。所以当你跟踪node_modules目录时,你可能会不小心提交一个OS特定的二进制文件。

如果package.json中提到了依赖关系,则Node_modules不需要检入。任何其他程序员都可以通过npm install来简单地获得它,npm足够聪明,可以让node_modules在你的项目工作目录中。

我想提供一个中间路线的选择。

不要在git中添加node_modules。 使用包锁。Json文件来确定你的依赖版本。 在CI或发布过程中,当你发布一个版本时,复制node_modules文件夹并备份它(例如在云存储中)。

在极少数情况下,你不能访问NPM(或你使用的其他注册表)或NPM中的特定包,你有一个node_modules的副本,可以继续工作,直到恢复访问。