在 Heroku 上每次部署后避免 npm refresh
Posted
技术标签:
【中文标题】在 Heroku 上每次部署后避免 npm refresh【英文标题】:Avoid npm refresh after every deployment on Heroku 【发布时间】:2012-05-28 17:52:13 【问题描述】:我有一个托管在 Heroku 上的 Node.js 网站,我使用 git 进行部署。 我使用了几个 node 模块,在 package.json 中引用;有没有办法阻止 Heroku 在我每次部署新版本的代码时“刷新”它们,只要 package.json 没有改变?
注意:这对于“原生”模块特别有用,因为它们的编译需要一些时间;对于 .js-only 模块,我成功地将它们从 package.json 中删除,并将它们的 node_modules/ 文件夹添加到 git repo 中。
【问题讨论】:
同意,有点构建缓存会很棒。但我知道它很快就会变得棘手。没有缓存仍然比不正确的缓存好。 【参考方案1】:我是官方 Heroku Node.js Buildpack 的维护者。
我们有一个新版本的 beta 版 buildpack,它具有缓存支持,专为上述用例而设计。你可以在https://github.com/heroku/heroku-buildpack-nodejs/tree/diet#about-this-refactor了解更多信息
最终这将成为 Heroku 上的默认 Node.js buildpack,但如果您现在想使用它,您需要明确设置 BUILPACK_URL 配置变量:
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
【讨论】:
现在好像默认了 它的 2015 年...... heroku 仍然重建所有依赖项吗? 我们有一个 ./node_modules 目录和一个 ./client/node_modules 目录的设置,因为我们将 CRA 项目部署为服务器的子项。是否也可以以某种方式缓存部署到 ./client 目录的 node_modules? 嗨泽克。 docker 是否识别新层何时与以前不同并且只重建任何新层,如果没有新层,只需使用最后一个(未更改的)图像?在heroku上可能会有类似的事情吗? (ps我不是节点,我正在运行R和rails,但我怀疑同样的原则适用)。作为参考,R 闪亮构建大约为 214MB(!)。所以任何效率都会产生影响【参考方案2】:似乎 David Dollar 最近在heroku-buildpack-nodejs 取得了进展。
简而言之:
heroku config:set BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-nodejs
在此处查看答案: https://***.com/a/18535675/1318839
【讨论】:
【参考方案3】:您可以同时添加 .js 和原生 npm 包,并且仍然避免“刷新”,(至少是“刷新”的重新下载部分。)
将本机包包含到您的node_modules/
目录中。当您部署到 Heroku 时,npm install
将跳过包的下载。 npm rebuild
也在运行。重新编译原生包需要一些时间,但它应该是可以忍受的,除非你有大量的原生包。
旁注:Heroku doc on what Heroku does when you push a nodejs app.
旁注:npm rebuild
是必需的,因为“node and native code modules after a node upgrade 之间可能会发生神秘的故障”。
【讨论】:
【参考方案4】:克隆 Heroku node.js buildpack,并修改它以删除 rebuild
命令。
命令当前在这里运行: https://github.com/heroku/heroku-buildpack-nodejs/blob/master/bin/compile#L180 ,但这一定会改变。
您可以通过修改以下命令来运行创建一个使用您自己的 buildpack 的应用程序以匹配您自己的 repo:heroku create --buildpack http://github.com/heroku/heroku-buildpack-nodejs.git
或通过以下方式更改现有应用的构建包:heroku config:add BUILDPACK_URL=git://github.com/heroku/heroku-buildpack-nodejs.git
【讨论】:
这很酷,但我需要在我的应用程序/构建包中包含私有存储库。所以我想知道这是否会有同样的问题,如果我必须保持 buildpack 私有。以上是关于在 Heroku 上每次部署后避免 npm refresh的主要内容,如果未能解决你的问题,请参考以下文章
您可以使用 Heroku 部署由 json-server NPM 模块运行的假后端吗?
我被这个错误困住了。当我按照所有步骤在heroku上部署角度应用程序时