在Heroku上创buildnode.js应用程序时,是否应该检查node_modules进行git?

我在这里按照Heroku上的node.js的基本入门说明:

https://devcenter.heroku.com/categories/nodejs

这些指令不会告诉你创build一个.gitignore node_modules,因此暗示node_modules应该被检入到git中。 当我在git中包含node_modules时,我的入门应用程序运行正常。

当我按照更先进的例子:

https://github.com/mongolab/tractorpush-server(source)https://devcenter.heroku.com/articles/realtime-polyglot-app-node-ruby-mongodb-socketio

它指示我将node_modules添加到.gitignore。 所以我从git中删除了node_modules,将它添加到.gitignore,然后重新部署。 这一次部署失败如此:

-----> Heroku receiving push -----> Node.js app detected -----> Resolving engine versions Using Node.js version: 0.8.2 Using npm version: 1.0.106 -----> Fetching Node.js binaries -----> Vendoring node into slug -----> Installing dependencies with npm Error: npm doesn't work with node v0.8.2 Required: node@0.4 || 0.5 || 0.6 at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23 at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3) at Module._compile (module.js:449:26) at Object.Module._extensions..js (module.js:467:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:362:17) at require (module.js:378:17) at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1) at Module._compile (module.js:449:26) Error: npm doesn't work with node v0.8.2 Required: node@0.4 || 0.5 || 0.6 at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23 at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3) at Module._compile (module.js:449:26) at Object.Module._extensions..js (module.js:467:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:362:17) at require (module.js:378:17) at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1) at Module._compile (module.js:449:26) Dependencies installed -----> Discovering process types Procfile declares types -> mongod, redis, web -----> Compiled slug size is 5.0MB -----> Launching... done, v9 

运行“heroku ps”确认了崩溃。 好吧,没问题,所以我回滚了更改,将node_module添加回git存储库,并从.gitignore中删除它。 但是,即使在恢复之后,我仍然在部署时收到相同的错误消息,但现在应用程序再次正常运行。 运行“heroku ps”告诉我应用程序正在运行。

所以我的问题是什么是正确的方法来做到这一点? 包含node_modules还是不是? 而当我回滚时为什么仍然会收到错误消息? 我的猜测是git仓库在Heroku方面处于不良状态?

第二次更新

常见问题解答不可用。

shrinkwrap文档:

如果你希望locking一个包中包含的特定字节,例如为了能够复制部署或构build100%的信心,那么你应该检查你的依赖到源代码控制,或者追求一些其他机制,可以validation内容而不是版本。

香农和史蒂文之前提到过这一点,但我认为,这应该是被接受的答案的一部分。


更新

列出的以下build议的来源已更新 。 他们不再build议node_modules文件夹。

通常,不。 允许npmparsing你的包的依赖关系。

对于您部署的软件包(如网站和应用程序),应该使用npm shrinkwrap来locking完整的依赖关系树:

https://docs.npmjs.com/cli/shrinkwrap


原始post

作为参考,npm常见问题解答清楚你的问题:

检查node_modules到你部署的东西,如网站和应用程序的git。 不要将node_modules检查到git中,以便重用库和模块。 使用npm来pipe理你的开发环境中的依赖关系,但不能在你的部署脚本中。

为此,请阅读Mikeal Rogers的文章 。


来源: https : //docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git

我最关心的是检查node_modules进入git是10年后,当你的生产应用程序仍在使用时,npm可能不在。 或者npm可能会被破坏; 或者维护者可能决定从你的仓库中删除你依赖的库; 或者您使用的版本可能会被删除。

像maven这样的repo manager可以缓解这个问题,因为你总是可以使用你自己的本地Nexus或者Artifactory来维护你使用的软件包的镜像。 据我所知,npm不存在这样的系统。 像Bower和Jamjs这样的客户端图书馆经理也是如此。

如果你已经把这些文件提交给你自己的git仓库,那么你可以在你喜欢的时候更新它们,而且你可以重复构build,并且知道你的应用程序不会因为某些第三方行为而中断。

你不应该在你的.gitignore 包含 node_modules (或者你应该在包含 node_modules的源代码中部署Heroku)。

如果node_modules

  • 然后npm install将使用这些销售库,并将重build与npm rebuild任何二进制依赖关系。
  • 不存在然后npm install将不得不提取所有的依赖本身,这增加了时间段的编译步骤。

请参阅Node.js buildpack源代码以获取这些确切的步骤

但是,原始错误看起来是npmnode版本之间的不兼容。 根据本指南始终明确设置packages.jsonengines部分以避免以下情况是个不错的主意:

 { "name": "myapp", "version": "0.0.1", "engines": { "node": "0.8.x", "npm": "1.1.x" } } 

这将确保开发/产品平价并减less未来这种情况的可能性。

我想在这个评论后离开这个: 我应该检查node_modules git在Heroku上创buildnode.js应用程序?

但是,stackoverflow的格式奇怪。 如果没有完全相同的机器并正在检查node_modules,请在本机扩展上执行.gitignore。 我们的.gitignore看起来像:

 # Ignore native extensions in the node_modules folder (things changed by npm rebuild) node_modules/**/*.node node_modules/**/*.o node_modules/**/*.a node_modules/**/*.mk node_modules/**/*.gypi node_modules/**/*.target node_modules/**/.deps/ node_modules/**/build/Makefile node_modules/**/**/build/Makefile 

首先检查所有内容,然后让另一个开发人员执行以下操作:

 rm -rf node_modules git checkout -- node_modules npm rebuild git status 

确保没有文件改变。

我相信npm install不应该在生产环境中运行。 有几件事情可能会出错–npm中断,下载更新的依赖关系(shrinkwrap似乎解决了这个问题)是其中的两个。

另一方面, node_modules不应该在git上提交。 包括他们在内的承诺可能会分散注意力。

最好的解决scheme是: npm install应该在类似于生产环境的CI环境中运行。 所有testing将运行,并将创build一个包含所有依赖关系的压缩版本文件。

我一直在使用提交node_modules文件夹和收缩包装。 这两个解决scheme并没有让我开心。

简而言之:提交的node_modules向存储库添加了太多的噪音。
而shrinkwrap.json并不容易pipe理,也不能保证在几年内就可以build立一些缩小包装的项目。

我发现Mozilla正在为他们的一个项目使用一个单独的存储库https://github.com/mozilla-b2g/gaia-node-modules

所以在节点CLI工具中实现这个想法并不需要很长时间。https://github.com/bestander/npm-git-lock

在每个构build之前添加
npm-git-lock –repo [git@bitbucket.org:your / dedicated / node_modules / git / repository.git]

它会计算你的package.json的hash值,并且会从远程的repo中检出node_modules的内容,或者,如果是这个package.json的第一个版本,将会执行一个干净的npm install ,并将结果推送到远程的repo。

而不是检查node_modules,为您的应用程序做一个package.json文件。

package.json文件指定应用程序的依赖关系。 Heroku然后可以告诉npm安装所有这些依赖关系。 你链接到的教程包含一个关于package.json文件的部分。

我的工作是显式地添加一个npm版本到package.json(“npm”:“1.1.x”),而不是检查node_modules git。 部署起来可能会比较慢(因为它会每次下载软件包),但是在签入时我无法获得软件包的编译。Heroku一直在寻找只存在于本地机器上的文件。

http://www.futurealoof.com/posts/nodemodules-in-git.html

回顾一下。

  • 只检查您部署的应用程序的node_modules,而不是您维护的可重用软件包。
  • 任何编译的依赖项都应该有源代码检查,而不是编译目标,并且应该在部署上重build$ npm。

我最喜欢的部分:

所有将node_modules添加到你的gitignore的人,今天删除这个狗屎 ,这是一个我们都非常高兴离开的时代的人造物。 全球模块的时代已经过去了。

http://nodejs.org/api/modules.html

[…]节点从当前模块的父目录开始,并添加/node_modules ,并尝试从该位置加载模块。

如果在那里没有find, 则移到父目录,依此类推 ,直到到达树的根。

如果您正在将自己的模块转换为特定于您的应用的模块,则可以将这些模块( 并且仅限于那些模块 )保存在您的应用/node_modules 。 将所有其他依赖移出到父目录。

这个非常棒的用例,它可以让你保留为你的应用程序专门为你的应用程序创build的模块,并且不会使用以后可以安装的依赖项来混淆你的应用程序。

我正在使用这个解决scheme:

  1. 创build保存node_modules单独存储库。 如果您有为特定平台构build的本机模块,请为每个平台创build单独的存储库。
  2. 使用git submodule将这些存储库附加到您的项目存储库:

git submodule add .../your_project_node_modules_windows.git node_modules_windows

git submodule add .../your_project_node_modules_linux_x86_64 node_modules_linux_x86_64

  1. 创build从平台特定的node_modulesnode_modules目录的链接并将node_modules添加到.gitignore
  2. 运行npm install
  3. 提交子模块存储库更改。
  4. 提交您的项目存储库更改。

因此,您可以在不同平台上轻松切换node_modules (例如,如果您正在OS X上开发并部署到Linux)。