Heroku很棒。但是每次我部署时,Heroku 似乎都喜欢重新下载并重建所有包。这socket.io
大约mailparser
需要 3 分钟。
有没有办法加快部署过程?有没有办法告诉 Heroku 它可以缓存这些项目?或者我可以上传预建的node_modules
吗?
从今天开始,Heroku 似乎终于缓存了该node_modules
文件夹!
-----> 删除 6 个匹配 .slugignore 模式的文件。
-----> 检测到 Node.js 应用程序
-----> 请求的节点范围:0.10.x
-----> 已解决节点版本:0.10.22
-----> 下载安装节点
-----> 从缓存中恢复 node_modules
-----> 安装依赖
-----> 修剪未使用的依赖项
-----> 为将来的构建缓存 node_modules 目录
-----> 清理 node-gyp 和 npm 工件
构建时间对我来说现在是 3 秒。
我为加快进程所做的一件事是将 .slugignore 文件添加到主文件夹并添加我不想运行应用程序的所有文件和文件夹。
.slugignore 文件的示例内容:
工作
模型
*.psd
*.pdf
我遇到了同样的问题。
这里有一些关于缓存node_modules
文件夹的讨论:https ://github.com/heroku/heroku-buildpack-nodejs/pull/37
另一个想法:https ://github.com/heroku/heroku-buildpack-nodejs/issues/25
我现在正在考虑一些解决方案。
签入node_modules
一个单独的分支:核心 Node.js 维护人员实际上建议将该node_modules
文件夹签入源代码控制(对于应用程序,而不是库)。我不喜欢这个。解决它的一种方法可能是有一个单独的production
分支,其中包含一个.gitignore
不忽略的不同文件node_modules
。当你想部署时,只需从你的主分支做一个 rebase 并且node_modules
将被签入。至少这可以让你的主分支免受依赖。
添加preinstall
脚本以package.json
下载压缩的依赖项 zip:您还可以添加一个 pre-push git 挂钩来捆绑您的依赖项并将它们上传到 S3。不过,这可能太慢了。
修改heroku-buildpack-nodejs
:将未完成的拉取请求与node_modules
缓存集成:
heroku config:set BUILDPACK_URL=https://github.com/opdemand/buildpack-nodejs.git
我有同样的问题(请参阅在 Heroku 上每次部署后避免 npm 刷新)。
Heroku 强制下载/构建/等。顺序,因为他们需要以“空白板”启动应用程序:清理以前未删除的文件,当他们将您的应用程序移动到另一台服务器时,当您分配新的网络测功机时,等等。
问题显然在于本机包和重新编译。对于所有仅 js 的包,我将它们与我的项目一起提交,并将它们从 package.json 中删除。它增加了几秒钟,但不是那么多。
如果您可以访问具有相同配置的 Linux 机器(或 VM),我绝对应该可以预编译和提交本机模块(例如,我在 Heroku 上成功运行 wkhtml2pdf,使用为 linux-amd64 编译的二进制文件) - 从今天开始,Linux [...] 2.6.32-350-ec2 #57-Ubuntu SMP [...] x86_64 GNU/Linux
.
尽管我不建议将其作为最终解决方案,因为它可能有一天会中断 - 在我看来,heroku 并不保证应用程序运行的平台。
似乎heroku-buildpack-nodejs最近取得了进展。
合并拉取请求后,您可以添加
heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-nodejs
到你的heroku 环境变量。
目前,David Dollar 的分叉存储库可在
https://github.com/ddollar/heroku-buildpack-nodejs
有了它,BUILDPACK_URL
它应该缓存 npm 模块。我尝试使用 node.js 0.10.5a,npm 版本:1.3.5 和.gitignore
. 到目前为止,Tt 似乎工作正常!
查看新 Heroku Node.js buildpack 的这个分支,现在处于 beta 阶段,它支持构建之间的 node_modules 缓存:
https://github.com/heroku/heroku-buildpack-nodejs/tree/diet
要使用它:
heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-nodejs#diet -a my-node-app
git commit -am "fakeout" --allow-empty
git push heroku