我是 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 服务,frontend
和 backend
,它们将被独立打包并安装在不同的实例上,它们永远不会在单个实例上共存。所以两者都需要包含通用包。
当你运行 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/