这是您可以考虑的一种方法。我将它用于 Google AppEngine Standard 上的多个全栈部署,并且由于 GAE 功能(版本控制、拆分流量、日志......)而更喜欢这个(与 GCS 相比)。但成本可能高于 GCS 公共存储桶。
这样做:
1) 为前端部署第一个服务
只需简单部署由ng build --prod 生成的Angular dist 文件夹。
选择一个简单的标准python 环境来执行此操作。
app.yaml 应该是这样的:
runtime: python27
threadsafe: true
api_version: 1
handlers:
- url: /(.+\.js)
static_files: app/\1
upload: app/(.+\.js)
- url: /(.+\.css)
static_files: app/\1
upload: app/(.+\.css)
- url: /(.+\.png)
static_files: app/\1
upload: app/(.+\.png)
- url: /(.+\.jpg)
static_files: app/\1
upload: app/(.+\.jpg)
- url: /(.+\.svg)
static_files: app/\1
upload: app/(.+\.svg)
- url: /favicon.ico
static_files: app/favicon.ico
upload: app/favicon.ico
- url: /(.+\.json)
static_files: app/\1
upload: app/(.+\.json)
- url: /(.+)
static_files: app/index.html
upload: app/index.html
- url: /
static_files: app/index.html
upload: app/index.html
我确信处理程序规则可能会被优化。我不是正则表达式的专家。 ;-)
deploy 文件夹的目录结构应如下所示:
/deploy
app.yaml
/app => generated by ng build
index.html
...bundles..js
/assets
...
此默认服务将照常在https://YOUR_PROJECT_ID.appspot.com 提供。
2) 为后端部署第二个服务
然后(并且仅在第一次前端部署之后),使用 Java 标准环境为后端部署第二个服务。
但是我们在<service>标签内精确地定义了服务的名称。这里我选择api,其他名字应该都可以。
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<version>1</version>
<threadsafe>true</threadsafe>
<runtime>java8</runtime>
<instance-class>F4</instance-class>
...
<service>api</service>
...
这项新服务将在https://YOUR_SERVICE_NAME-dot-YOUR_PROJECT_ID.appspot.com 提供,所以这里是https://api-dot-YOUR_PROJECT_ID.appspot.com。
注意后台管理CORS,正确接受https://YOUR_PROJECT_ID.appspot.com的请求。