我应该在node_modules检查创建在Heroku使Node.js应用时与git?(Should

2019-06-17 10:37发布

我遵循的基本让这里在Heroku node.js的启动说明:

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

这些指令不告诉你创建的.gitignore node_modules,因此暗示node_modules应与git进行检查。 当我包括混帐node_modules我入门的应用程序正确运行。

当我跟着更高级的例子为:

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

它指示我添加node_modules到的.gitignore。 所以我删除了从混帐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”确认坠毁。 OK,没问题,所以我回滚更改,添加node_module回Git仓库,并从的.gitignore删除它。 然而,即使恢复后,我仍然得到上部署相同的错误消息,但现在应用程序再次正常运行。 运行“的Heroku PS”告诉我的应用程序运行。

所以我的问题是什么是应该做的正确方法? 包括node_modules与否? 为什么我还会收到错误消息时,我回滚? 我的猜测是Git仓库,在Heroku的侧不良状态?

Answer 1:

第二次更新

常见问题解答不再可用。

从文档shrinkwrap

如果你想锁定包含在一个包中的特定字节,例如有100%的信心,能够再现部署或建造,那么你应该检查你的依赖源代码控制,或采取一些其他的机制可以验证内容而不是形式。

香农和史蒂芬之前提到这一点,但我想,这应该是公认的答案的一部分。


更新

在下文建议中列出的源已被更新 。 他们不再推荐的node_modules文件夹被提交。

通常情况下,没有。 允许NPM解决依赖于你的包。

对于部署软件包,如网站和应用程序,你应该使用NPM拆封来锁定您的全依赖关系树:

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


原贴

作为参考,NPM常见问题回答您的问题明确提出:

检查node_modules到混帐东西部署,如网站和应用。 不检查node_modules成的git的打算重用库和模块。 使用NPM在你的开发环境来管理依赖关系,但不是在你的部署脚本。

并为一些这方面的好理由,读Mikeal罗杰斯对这个职位 。


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



Answer 2:

我与检查最大的担忧node_modules到Git是,10年的道路,当你生产中的应用仍然在使用,NPM可能无法左右。 或者NPM可能会损坏; 或维护者可能决定删除您从他们的仓库依赖库; 或者您使用的版本可能会被削减了。

这可以通过回购经理像行家来缓解,因为你可以随时使用自己的地方联结或Artifactory的保持与您所使用的软件包的镜子。 据我了解,这样的系统不存在NPM。 这同样适用于客户端库经理像鲍尔和Jamjs。

如果你提交文件到您自己的混帐回购协议,那么你就可以在你喜欢更新他们,你有重复的构建舒适性和您的应用程序不会因为某些第三方的行动打破了知识。



Answer 3:

应该包括 node_modules在你.gitignore (或者更确切地说, 你应该包括 node_modules在源代码部署到Heroku的)。

如果node_modules

  • 存在 ,那么npm install将使用这些vendored库和将重建与任何二进制依赖npm rebuild
  • 不存在 ,则npm install必须取这增加的时间段塞编译步骤都依赖本身。

见Node.js的buildpack源这些具体步骤

但是,原来的错误看起来是各版本之间的不兼容npmnode 。 这是一个好主意,始终明确设置engines的第packages.json根据本指南 ,以避免这几种情况:

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

这将确保开发/生产奇偶校验 ,并减少在未来的这种情况的可能性。



Answer 4:

我正想此评论之后离开这个: 创建在Heroku使Node.js应用的时候,我应该node_modules检查混帐?

但计算器是格式化很奇怪。 如果您不具有相同的机器和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

确保没有改变的文件。



Answer 5:

我认为, npm install不应该在生产环境中运行。 有几件事情可能出错的地方 - 故宫停运,新的依存关系下载(拆封似乎解决了这个)是其中的两个。

在另一方面, node_modules不应在git的承诺。 除了他们的大尺寸,犯下包括他们可以成为分心。

最佳的解决方案是这样的: npm install应该在CI环境,类似于生产环境中运行。 所有的测试运行和压缩释放文件将被创建,这将包括所有的依赖关系。



Answer 6:

我一直在使用这两个承诺node_modules文件夹和收缩包装。 这两种解决方案并没有使我快乐。

总之:致力于node_modules添加了太多噪音库。
而shrinkwrap.json是不容易管理,也没有保证一定收缩包装项目将建设在几年。

我发现,Mozilla的是使用一个独立的存储设备为他们的项目之一https://github.com/mozilla-b2g/gaia-node-modules

所以也没多久我就实现这个想法中的一个节点CLI工具https://github.com/bestander/npm-git-lock

只是每次构建插件之前
NPM-git的锁定--repo [git@bitbucket.org:你的/专用/ node_modules /混帐/ repository.git]

它会计算你的package.json的哈希值,将要么从远程回购退房node_modules内容,或者,如果是这样的package.json第一的构建,将做一个干净的npm install ,结果推送到远程的回购。



Answer 7:

什么工作对我来说是明确加入NPM版本的package.json(“故宫”:“1.1.x版本”),并在node_modules与git不检查。 它可能会比较慢部署(因为它下载每次包),但我无法得到,当他们在。Heroku上一直在寻找,只有在我的本地盒存在的文件进行了检查包进行编译。



Answer 8:

相反,在node_modules检查,请为您的应用的package.json文件。

该文件的package.json您指定应用程序的依赖。 随后的Heroku可以告诉NPM安装所有这些依赖性。 您链接到本教程包含的package.json文件的部分。



Answer 9:

我使用此解决方案:

  1. 创建一个拥有独立仓库node_modules 。 如果有,应建立特定平台的本地模块,然后为每个平台创建独立的存储设备。
  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. 从创建特定于平台的链接node_modulesnode_modules目录,并添加node_modules.gitignore
  2. 运行npm install
  3. 提交子模块库的变化。
  4. 提交您的项目库中的变化。

所以,你可以很容易地之间切换node_modules在不同的平台(例如,如果您是在OS X开发和部署到Linux)。



Answer 10:

从https://web.archive.org/web/20150212165006/http://www.futurealoof.com/posts/nodemodules-in-git.html :

编辑:原路段是这一个 ,但它现在已经死了。 感谢@Flavio指点出来。

回顾一下。

  • 只签入node_modules为您部署的应用程序,你保持不可重复使用的软件包。
  • 任何编译依赖关系应该有自己的源检查中,未编译的目标,并于$ NPM重建上部署。

我最喜欢的部分:

所有的人你们谁补充node_modules您gitignore, 除去那些废话,今天 ,这是一个时代,我们都太高兴了,留下的神器。 全球模块的时代已经死了。



Answer 11:

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

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

如果没有找到它, 然后将其移动到父目录,依此类推 ,直到到达树的根。

如果你正在推出自己的模块具体到你的应用程序,你可以在你的应用程序的那些( 只有那些/node_modules 。 而搬出所有其他依赖于父目录。

相当真棒的这种使用情况下,它可以让你保持你专门创建的模块为您的应用程序很好地与您的应用程序,并且不与以后可以安装依赖搞乱你的应用程序。



Answer 12:

场景1:

一种情况:你使用会从NPM取出一个包。 如果您在文件夹node_modules所有模块,那么它不会成为你的问题。 如果你只在具有的package.json包名,你不能得到它了。 如果包是不到24小时的时候,你可以很容易地从故宫删除。 如果是超过24小时大,那么你需要与他们联系。 但:

如果您联系支持,他们会检查,看看是否删除该版本您的包裹将打破任何其他安装。 如果是这样,我们不会将其删除。

阅读更多

因此,对于这个机会比较小,但情况2 ...


场景2:

另一场景是这样的话:你开发软件的企业版或非常重要的软件,并在您的package.json写:

"dependencies": {
    "studpid-package": "~1.0.1"
}

您可以使用方法function1(x)那个包的。

现在studpid包的开发商重命名方法function1(x)function2(x) ,他们做一个错......他们自己包的版本改变从1.0.11.1.0 。 这是一个问题,因为当你调用npm install接下来的时间,你会接受版本1.1.0 ,因为你使用的波浪号( "studpid-package": "~1.0.1" )。

调用function1(x)现在可以导致错误和问题。


推动整个node_modules文件夹(通常超过100 MB)到你的资料库,将花费你的内存空间。 几KB(只的package.json)与数百MB的(的package.json&node_modules)相比......想想吧。

可以做到这一点/应该想一想 ,如果:

  • 该软件是非常重要的。

  • 在出现故障时它的成本你钱。

  • 你不信任故宫注册表。 NPM是集中式的,理论上被关闭。

并不需要发布node_modules文件夹中的情况下,如果99.9%:

  • 你开发了一个软件,只为自己。

  • 已设定好的东西,只是想发布在GitHub上的结果,因为别人也许可以也感兴趣。


如果你不希望node_modules在你的仓库,刚刚创建.gitignore文件,并添加行node_modules



文章来源: Should I check in node_modules to git when creating a node.js app on Heroku?