我遵循了Heroku上Node.js的基本入门说明:

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

这些指令并没有告诉你创建一个.gitignore node_modules,因此意味着node_modules文件夹应该签入Git。当我在Git存储库中包含node_modules时,我的启动应用程序正常运行。

当我遵循更高级的例子在:

用Node.js, Ruby, MongoDB和Socket构建实时,多语言应用程序。IO https://github.com/mongolab/tractorpush-server(源)

它指示我将文件夹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 ?为什么回滚时仍然会得到错误消息?我猜Heroku这边的Git仓库状态很差。


当前回答

显式地将npm版本添加到文件包中。json ("npm": "1.1.x")和不签入文件夹node_modules Git为我工作。

它的部署速度可能较慢(因为它每次都下载包),但当检入包时,我无法编译这些包。赫鲁库在找只存在于我本地盒子里的文件。

其他回答

第二次更新

常见问题解答不再可用。

从收缩膜的文件:

如果您希望锁定包中包含的特定字节,例如有100%的信心能够重新生成部署或构建,那么您应该检查源代码控制中的依赖项,或者使用其他可以验证内容而不是版本的机制。

香农和史蒂文之前提到过这个问题,但我认为这应该是公认答案的一部分。


更新

以下建议所列的来源已经更新。他们不再建议提交node_modules文件夹。

通常,没有。允许npm为你的包解析依赖关系。 对于你部署的包,比如网站和应用程序,你应该使用npm 收缩包装锁定您的全部依赖树: https://docs.npmjs.com/cli/shrinkwrap


最初的发布

作为参考,npm FAQ清楚地回答了你的问题:

将你部署的东西(比如网站)的node_modules签入git 和应用程序。不检查node_modules到git的库和模块 打算被重用。使用npm来管理开发中的依赖项 环境,但不在部署脚本中。

想要找到一些合理的理由,可以阅读Mikeal Rogers的帖子。


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

在Heroku上创建Node.js应用程序时,我应该在文件夹“node_modules”中检入Git吗?

但是Stack Overflow的格式很奇怪。

如果您没有相同的机器,并且正在检入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。除了它们的大小之外,包含它们的提交可能会分散注意力。

最好的解决方案是:npm install应该运行在一个类似于生产环境的CI环境中。所有测试都将运行,并将创建一个包含所有依赖项的压缩发布文件。

我正在使用这个解决方案:

Create a separate repository that holds folder node_modules. If you have native modules that should be build for specific platform then create a separate repository for each platform. Attach these repositories to your project repository with 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 Create a link from platform-specific node_modules to node_modules directory and add node_modules to .gitignore. Run npm install. Commit submodule repository changes. Commit your project repository changes.

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

我一直在使用提交node_modules文件夹和收缩包装。两种解决方案都不能让我开心。

简而言之:提交的node_modules文件夹给存储库添加了太多噪音。和收缩包装。Json不容易管理,而且也不能保证在几年内就能构建出一些收缩包装的项目。

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

因此,我很快就在Node.js CLI工具https://github.com/bestander/npm-git-lock中实现了这个想法

在每次构建之前,添加:

npm-git-lock --repo [git@bitbucket.org:your/dedicated/node_modules/git/repository.git]

它将计算包的哈希值。Json文件,并将从远程存储库中检出文件夹node_modules内容,或者,如果它是这个包的第一个构建。Json文件,将做一个干净的NPM安装,并将结果推送到远程存储库。