在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完整的依赖关系树:
原始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源代码以获取这些确切的步骤
但是,原始错误看起来是npm
和node
版本之间的不兼容。 根据本指南始终明确设置packages.json
的engines
部分以避免以下情况是个不错的主意:
{ "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:
- 创build保存
node_modules
单独存储库。 如果您有为特定平台构build的本机模块,请为每个平台创build单独的存储库。 - 使用
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
- 创build从平台特定的
node_modules
到node_modules
目录的链接并将node_modules
添加到.gitignore
。 - 运行
npm install
。 - 提交子模块存储库更改。
- 提交您的项目存储库更改。
因此,您可以在不同平台上轻松切换node_modules
(例如,如果您正在OS X上开发并部署到Linux)。