在Heroku上创建node.js应用程序时要模块?

我在这里遵循了Heroku上的node.js的基本入门说明:

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

这些指令不会告诉你创建一个.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方面处于不良状态?


第二次更新

该FAQ不再可用。

shrinkwrap的文档:

如果您希望锁定包中包含的特定字节,例如为了能够复制部署或构建100%的信心,那么您应该检查您的依赖关系到源代码控制中,或者寻求其他一些可以验证的机制内容而不是版本。

香农和史蒂文之前提到过这一点,但我认为,它应该成为公认的答案的一部分。


更新

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

通常,不。 允许npm解析你的包的依赖关系。

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

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


原始帖子

作为参考,npm常见问题清楚地回答您的问题:

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

并为此提供一些理由,请阅读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管理器来缓解,因为您始终可以使用自己的本地Nexus或Artifactory来维护您使用的软件包的镜像。 据我所知,npm不存在这样的系统。 客户端图书馆管理人员(如Bower和Jamjs)也是如此。

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


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

如果node_modules

  • 存在 ,那么npm install将使用这些vendored库和将重建与任何二进制依赖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"
      }
    }
    

    这将确保dev / prod平价并减少将来出现这种情况的可能性。

    链接地址: http://www.djcxy.com/p/52509.html

    上一篇: modules to git when creating a node.js app on Heroku?

    下一篇: cloud9 + mongodb + nodejs