node.js - 如何部署具有本地 npm 依赖项的 GAE 服务?

标签 node.js google-app-engine npm google-cloud-platform gcloud

我是 Google Cloud 的新手,似乎不知道如何部署具有同级本地依赖项的 Google App Engine 服务。我有一个这样的项目结构(我的堆栈是 TypeScript、nestJS、React):

-frontend
    app.yaml
    package.json
-backend
    app.yaml
    package.json
-common
    package.json
dispatch.yaml
frontend包将静态代码部署到 default服务,以及 backend包部署到 api服务。 common包包含一些我想在前端和后端之间共享的代码。他们将其包含在他们的package.json 中。像这样的文件:
dependencies: {
    common: "file:../common"
}

这种结构在本地运行良好。问题是当我部署后端时,npm install失败,因为它找不到 common包裹。这是有道理的,因为我知道它只会上传 backend 的内容到那个服务。但是实现这一目标的正确方法是什么?

我想我可以只部署一个包含所有代码的服务,并拥有我的顶级 package.json代表npm start到后台的package.json .但这只是因为我的前端是完全静态的,所以我只有一个需要 npm start 的包被叫。似乎应该有更好的方法来处理这个问题,因为如果我有两个独立的后端,每个后端都需要自己的 npm start,那么这种方法就会失败。 .

我猜我正在以一种根本错误的方式思考这方面的某些方面,但我需要帮助弄清楚那是什么。

最佳答案

这里的事情是您定义了 2 个 App Engine 服务,frontendbackend ,它们将被独立打包并安装在不同的实例上,它们永远不会在单个实例上共存。所以两者都需要包含通用包。

当你运行 gcloud app deploy ,包含 app.yaml 的文件夹如您所述,该服务的文件被视为根文件夹,并且不会部署树中的文件和文件夹。

我知道从开发的角度来看,让两个服务共享一个公共(public)包是有意义的,因为它避免了重复代码。一种管理方法是使用 Cloud Build创建一个构建管道,该管道将处理将此公共(public)代码合并到两个服务中并单独部署它们。例如,像这样:

steps:
- name: ubuntu
  id: 'copy-file'
  args:
  - '-c'
  - |
        cp ./common/package.json frontend/ && cp ./common/package.json backend/
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['app', 'deploy']
  dir: 'frontend/'
  timeout: '1600s'
  waitFor: ['copy-file']
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['app', 'deploy']
  dir: 'backend/'
  timeout: '1600s'
  waitFor: ['copy-file']

第一步将把公共(public)包复制到两个目录(你需要更新你的package.json 中的公共(public)依赖路径,因为它现在在同一个目录中)。接下来的 2 个步骤将并行运行(wait for 都是要完成的第一步)并分别部署每个服务(注意 dir 参数)。

然后,您可以通过在根目录中运行以下命令来部署服务:
gcloud builds submit

请注意,这将始终部署这两个服务。

如果您希望能够部署一项服务而不是另一项服务,则可以定义 2 个 cloudbuilds 文件,如下所示:

cloudbuild-frontend.yaml :
steps:
- name: ubuntu
  args:
  - '-c'
  - |
        cp ./common/package.json frontend/
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['app', 'deploy']
  dir: 'frontend/'
  timeout: '1600s'

cloudbuild-backend.yaml :
steps:
- name: ubuntu
  args:
  - '-c'
  - |
        cp ./common/package.json backend/
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['app', 'deploy']
  dir: 'backend/'
  timeout: '1600s'

你最终会得到一棵这样的树:
-frontend
    app.yaml
    package.json
-backend
    app.yaml
    package.json
-common
    package.json
cloudbuild-frontend.yaml
cloudbuild-backend.yaml
dispatch.yaml

然后,您可以通过运行 gcloud builds submit --config=cloudbuild-frontend.yaml 来部署一项服务或另一项服务。或 gcloud builds submit --config=cloudbuild-backend.yaml

关于node.js - 如何部署具有本地 npm 依赖项的 GAE 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61312969/

相关文章:

node.js - 如何开发通过本地目录从另一个项目引用的 Node 库?

javascript - Passport.js - req.isAuthenticated 不是函数

python - 在 SQLAlchemy 中优化包含多条记录的 Update 语句

twitter-bootstrap - Laravel 混合 | Bootstrap 弃用警告 : Using/for division is deprecated and will be removed

Angular 包安装

java - NoSuchMethodError : org. slf4j.helpers.MessageFormatter.格式

javascript - 递归异步函数返回未定义

node.js - Node JS Get 随机停止工作

javascript - 渲染方法中出现意外的标记参数

python - 在 Python 2.7 中实现 Python 3 的 round 函数