在 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 时的本地或私有 NPM 模块

我被这个错误困住了。当我按照所有步骤在heroku上部署角度应用程序时

Heroku 最近开始在 Webpack 构建期间给出部署错误“npm ERR!code ELIFECYCLE”

Npm 错误!缺少脚本:部署到 heroku 时开始

Discord.js 机器人 | Heroku 部署错误 | npm 错误!缺少脚本:开始