【问题标题】:Avoid npm refresh after every deployment on Heroku在 Heroku 上每次部署后避免 npm refresh
【发布时间】:2012-05-28 17:52:13
【问题描述】:

我有一个托管在 Heroku 上的 Node.js 网站,我使用 git 进行部署。 我使用了几个 node 模块,在 package.json 中引用;有没有办法阻止 Heroku 在我每次部署新版本的代码时“刷新”它们,只要 package.json 没有改变?

注意:这对于“原生”模块特别有用,因为它们的编译需要一些时间;对于 .js-only 模块,我成功地将它们从 package.json 中删除,并将它们的 node_modules/ 文件夹添加到 git repo 中。

【问题讨论】:

  • 同意,有点构建缓存会很棒。但我知道它很快就会变得棘手。没有缓存仍然比不正确的缓存好。

标签: node.js heroku npm


【解决方案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://stackoverflow.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 私有。
      猜你喜欢
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2012-08-22
      • 2014-06-19
      相关资源
      最近更新 更多