【问题标题】:Can't deploy to Heroku a node.js app with local dependency无法将具有本地依赖关系的 node.js 应用程序部署到 Heroku
【发布时间】:2021-04-12 11:17:39
【问题描述】:

所以我们有一个 node.js 解决方案,在私有 GitLab 实例上的同一存储库中包含 3 个项目。

  • 1st -> 我们通过 ci/cd 部署到第一个 Heroku 的 Node.js Web 应用程序
  • 2nd -> 我们通过 ci/cd 部署到 2nd Heroku 的另一个 Node.js API
  • 3rd -> 第一个和第二个包常用的包,我们希望与它们一起部署

所以我们 npm 将第三个包与第一个和第二个包链接。

当我们只有第一个和第二个包时,部署很好,我们没有任何问题。

注意:我们使用 DPL 在 Heroku 上进行部署

dpl --provider=heroku --app=$HEROKU_WEB --api-key=$HEROKU_API_KEY --skip_cleanup

但随后我们触发了 3 个包的部署,部署失败:

Installing dependencies
   Installing node modules
   npm ERR! code EEXIST
   npm ERR! syscall mkdir
   npm ERR! path /tmp/build_4b93de5e/node_modules/ai-validator
   npm ERR! errno -17
   npm ERR! EEXIST: file already exists, mkdir '/tmp/build_4b93de5e/node_modules/ai-validator'
   npm ERR! File exists: /tmp/build_4b93de5e/node_modules/ai-validator
   npm ERR! Remove the existing file and try again, or run npm
   npm ERR! with --force to overwrite files recklessly.
   
   npm ERR! A complete log of this run can be found in:
   npm ERR!     /tmp/npmcache.BtRYQ/_logs/2020-12-18T09_45_42_167Z-debug.log
-----> Build failed

根据日志,我们必须使用 npm install --force 但在 Heroku 上,我们没有这个权限。

从那里,我查找了几个解决方案,我发现了关于 git 的符号链接出错的事情,但现在似乎在 git 中解决了。

我主要发现这是不可能的,您必须将包托管在 npm 之类的地方,以便 Heroku npm 安装可以找到它。我们无法使用此解决方案,因为我们不允许这样做。

也可能是 DPL,但老实说,我不知道我能用它做什么。

所以我有点卡在那里。

有什么想法吗?

【问题讨论】:

    标签: node.js heroku node-modules


    【解决方案1】:

    我遇到了同样的问题,我发现这是他们的 GitHub 部署方法的问题,出于某种原因,至少在我的情况下是这样。

    我已经切换到他们的 Heroku CLI,它正确识别了子模块并能够部署应用程序。

    给出一些观点;我的结构是这样的:

    前端(react app)用于构建应用程序,后端(express)服务于生产构建并且是 API 服务器。 Heroku 首先在前端运行 react-scripts build 来构建生产版本,然后运行 ​​node ./back-end/main.js

    前端是我的顶级仓库,后端是我的子模块

    front-end/
    front-end/back-end (git submodule)
    

    假设您的子模块也是一个 npm 包,我必须在 package.json 中添加我的后端文件夹作为前端的依赖项。这使得您的子模块包被正确识别为依赖项,并且其依赖包也通过 npm 下载(它们将存储在前端 .node-modules 中,而不是后端)

    "dependencies": {
        [...]
        "back-end": "file:back-end", // This points to ./backend
        [...]
    }
    

    我的 Procfile 位于最顶层的包(前端)中,它看起来像这样:

    web: node ./backend/main.js
    

    不确定我的回答是否会有所帮助,但简而言之:GitHub 部署对我不起作用,但使用他们的 CLI 工具并将其托管在他们的 git 上确实有效。这可能不是用户问题。

    【讨论】:

    • 感谢您的完整回答!我会在这个星期一试一试,然后回复你:)
    • 所以我尝试了,但它并没有真正帮助我。我最后使用 gitlab 私有包注册表部署了包,然后我使用 npmrc 注册表部署了主包。
    猜你喜欢
    • 2021-08-29
    • 2020-09-06
    • 2012-10-30
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    相关资源
    最近更新 更多