将基本的Angular 2应用部署到谷歌应用引擎



我可以使用Angular 2来创建基本的前端应用程序,也可以使用python来创建带有Google App引擎端点的后端。然而,我似乎不知道如何将两者结合在一起,并将它们与云SDK一起部署。

这是一个基本的例子,我甚至不能托管一个简单的angular2应用程序,没有对GAE的后端调用。在使用angular2 CLI构建后,我已经采取了dist文件夹,并试图用app.yaml文件连接到它。它似乎在浏览器开发人员(dev_appserver.py app.yaml)中工作,尽管我在SDK中得到一些404错误,我认为get请求与我的index.html文件有关。然后创建一个空白索引。yaml文件并尝试部署它,但在appspot.com位置得到404错误。这是app.yaml文件:

application:
version:
runtime: python27
threadsafe: true
api_version: 1
handlers:
- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico
- url: (.*)/
  static_files: dist1/index.html
  upload: dist
- url: (.*)
  static_files: dist1
  upload: dist

我真的不知道我做错了什么。我是否需要某种主。应用程序python后端连接到dist文件还是?我需要从Angular2中包含节点模块或其他类型的文件吗?任何帮助都会非常感激!由于

对于最新版本的Angular 4和App Engine,我构建了如下代码:

service: stage
runtime: python27
api_version: 1
threadsafe: true
skip_files:
- ^(?!dist)  # Skip any files not in the dist folder
handlers:
# Routing for bundles to serve directly
- url: /((?:inline|main|polyfills|styles|vendor).[a-z0-9]+.bundle.js)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/1
  upload: dist/.*
# Routing for a prod styles.bundle.css to serve directly
- url: /(styles.[a-z0-9]+.bundle.css)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/1
  upload: dist/.*
# Routing for typedoc, assets and favicon.ico to serve directly
- url: /((?:assets|docs)/.*|favicon.ico)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/1
  upload: dist/.*
# Any other requests are routed to index.html for angular to handle so we don't need hash URLs
- url: /.*
  secure: always
  redirect_http_response_code: 301
  static_files: dist/index.html
  upload: dist/index.html
  http_headers:
    Strict-Transport-Security: max-age=31536000; includeSubDomains
    X-Frame-Options: DENY

寻找如何改进的反馈

我现在更新app.yaml文件中的处理程序,使其看起来像这样用于静态上传到google云平台。如果正则表达式不是这样的,Angular Router就会出现问题。Dist文件夹是angular cli ng build:

的输出
handlers:
- url: /favicon.ico
  static_files: dist/favicon.ico
  upload: dist/assets/favicon.ico
- url: /(.*.(gif|png|jpg|css|js)(|.map))$
  static_files: dist/1
  upload: dist/(.*)(|.map)
- url: /(.*)
  static_files: dist/index.html
  upload: dist/index.html

更新:

对于生产ng build --prod,这是我的app.yaml文件的样子:

runtime: python27
threadsafe: true
api_version: 1
handlers:
- url: /(.*.(gif|png|jpeg|jpg|css|js|ico))$
  static_files: dist/1
  upload: dist/(.*)
- url: /(.*)
  static_files: dist/index.html
  upload: dist/index.html

我会将dist文件夹中的任何其他文件类型添加到第一个处理程序中的regex分组字符中:(gif|png|jpeg|jpg|css|js|ico)

在Angular 6中,文件结构发生了一些变化。以下是基于@Rob的回答,但针对启用了service-worker的Angular 6进行了更新。请务必将"my-app"替换为应用的文件夹名称。

service: stage
runtime: python27
api_version: 1
threadsafe: true
skip_files:
- ^(?!dist)  # Skip any files not in the dist folder
handlers:
# Routing for bundles to serve directly
- url: /((?:runtime|main|polyfills|styles|vendor).[a-z0-9]+.js)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/my-app/1
  upload: dist/my-app/.*
# Routing for bundle maps to serve directly
- url: /((?:runtime|main|polyfills|styles|vendor).[a-z0-9]+.js.map)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/my-app/1
  upload: dist/my-app/.*
# Routing for a prod styles.bundle.css to serve directly
- url: /(styles.[a-z0-9]+.css)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/my-app/1
  upload: dist/my-app/.*
# Routing for typedoc, assets, and favicon.ico to serve directly
- url: /((?:assets|docs)/.*|favicon.ico)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/my-app/1
  upload: dist/my-app/.*
# Routing for service worker files serve directly
- url: /(manifest.json|ngsw.json|ngsw-worker.js|safety-worker.js|worker-basic.min.js|ngsw_worker.es6.js.map)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/my-app/1
  upload: dist/my-app/.*
# Any other requests are routed to index.html for angular to handle so we don't need hash URLs
- url: /.*
  secure: always
  redirect_http_response_code: 301
  static_files: dist/my-app/index.html
  upload: dist/my-app/index.html
  http_headers:
    Strict-Transport-Security: max-age=31536000; includeSubDomains
    X-Frame-Options: DENY

看起来您的正则表达式匹配在错误的位置。试试这个格式:

handlers:
- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico
- url: /
  static_files: dist/index.html
  upload: dist/index.html
- url: /(.*)
  static_files: dist/1
  upload: dist/(.*)

这是我们在App Engine上创建静态主机教程时遇到的一些奇怪的测试结果。

将app.yaml替换为以下内容:会成功的!

application: you-app-name-here
version: 1
runtime: python
api_version: 1
default_expiration: "30d"
handlers:
- url: /(.*.(appcache|manifest))
  mime_type: text/cache-manifest
  static_files: static/1
  upload: static/(.*.(appcache|manifest))
  expiration: "0m"
- url: /(.*.atom)
  mime_type: application/atom+xml
  static_files: static/1
  upload: static/(.*.atom)
  expiration: "1h"
- url: /(.*.crx)
  mime_type: application/x-chrome-extension
  static_files: static/1
  upload: static/(.*.crx)
- url: /(.*.css)
  mime_type: text/css
  static_files: static/1
  upload: static/(.*.css)
- url: /(.*.eot)
  mime_type: application/vnd.ms-fontobject
  static_files: static/1
  upload: static/(.*.eot)
- url: /(.*.htc)
  mime_type: text/x-component
  static_files: static/1
  upload: static/(.*.htc)
- url: /(.*.html)
  mime_type: text/html
  static_files: static/1
  upload: static/(.*.html)
  expiration: "1h"
- url: /(.*.ico)
  mime_type: image/x-icon
  static_files: static/1
  upload: static/(.*.ico)
  expiration: "7d"
- url: /(.*.js)
  mime_type: text/javascript
  static_files: static/1
  upload: static/(.*.js)
- url: /(.*.json)
  mime_type: application/json
  static_files: static/1
  upload: static/(.*.json)
  expiration: "1h"
- url: /(.*.m4v)
  mime_type: video/m4v
  static_files: static/1
  upload: static/(.*.m4v)
- url: /(.*.mp4)
  mime_type: video/mp4
  static_files: static/1
  upload: static/(.*.mp4)
- url: /(.*.(ogg|oga))
  mime_type: audio/ogg
  static_files: static/1
  upload: static/(.*.(ogg|oga))
- url: /(.*.ogv)
  mime_type: video/ogg
  static_files: static/1
  upload: static/(.*.ogv)
- url: /(.*.otf)
  mime_type: font/opentype
  static_files: static/1
  upload: static/(.*.otf)
- url: /(.*.rss)
  mime_type: application/rss+xml
  static_files: static/1
  upload: static/(.*.rss)
  expiration: "1h"
- url: /(.*.safariextz)
  mime_type: application/octet-stream
  static_files: static/1
  upload: static/(.*.safariextz)
- url: /(.*.(svg|svgz))
  mime_type: images/svg+xml
  static_files: static/1
  upload: static/(.*.(svg|svgz))
- url: /(.*.swf)
  mime_type: application/x-shockwave-flash
  static_files: static/1
  upload: static/(.*.swf)
- url: /(.*.ttf)
  mime_type: font/truetype
  static_files: static/1
  upload: static/(.*.ttf)
- url: /(.*.txt)
  mime_type: text/plain
  static_files: static/1
  upload: static/(.*.txt)
- url: /(.*.unity3d)
  mime_type: application/vnd.unity
  static_files: static/1
  upload: static/(.*.unity3d)
- url: /(.*.webm)
  mime_type: video/webm
  static_files: static/1
  upload: static/(.*.webm)
- url: /(.*.webp)
  mime_type: image/webp
  static_files: static/1
  upload: static/(.*.webp)
- url: /(.*.woff)
  mime_type: application/x-font-woff
  static_files: static/1
  upload: static/(.*.woff)
- url: /(.*.xml)
  mime_type: application/xml
  static_files: static/1
  upload: static/(.*.xml)
  expiration: "1h"
- url: /(.*.xpi)
  mime_type: application/x-xpinstall
  static_files: static/1
  upload: static/(.*.xpi)
# image files
- url: /(.*.(bmp|gif|ico|jpeg|jpg|png))
  static_files: static/1
  upload: static/(.*.(bmp|gif|ico|jpeg|jpg|png))
# audio files
- url: /(.*.(mid|midi|mp3|wav))
  static_files: static/1
  upload: static/(.*.(mid|midi|mp3|wav))  
# windows files
- url: /(.*.(doc|exe|ppt|rtf|xls))
  static_files: static/1
  upload: static/(.*.(doc|exe|ppt|rtf|xls))
# compressed files
- url: /(.*.(bz2|gz|rar|tar|tgz|zip))
  static_files: static/1
  upload: static/(.*.(bz2|gz|rar|tar|tgz|zip))
# index files
- url: /(.+)/
  static_files: static/1/index.html
  upload: static/(.+)/index.html
  expiration: "15m"
- url: /(.+)
  static_files: static/1/index.html
  upload: static/(.+)/index.html
  expiration: "15m"
# site root
- url: /
  static_files: static/index.html
  upload: static/index.html
  expiration: "15m"

首先运行以下命令构建angular项目

--ng build prod
构建完成后,在项目的根文件夹中创建一个app.yaml文件并粘贴以下代码:
# [START runtime]
runtime: python27
threadsafe: yes
# [END runtime]
handlers:
- url: /(.+)
 static_files: dist/1
 upload: dist/(.*)
- url: /
 static_files: dist/index.html
 upload: dist/index.html
# Temporary setting to keep gcloud from uploading not required files for 
deployment
skip_files:
- ^node_modules$
- ^app.yaml
- ^README..*
- .gitignore
- ^.git$
- ^grunt.js
- ^src$
- ^e2e$
- .editorconfig
- ^karma.config.js
- ^package.json
- ^protractor.conf.js
- ^tslint.json

运行后:

gcloud app deploy

如果你使用的是自定义字体,你可以使用这个模板:

handlers:
  # Routing for bundles to serve directly
  - url: /(.*.(gif|png|jpeg|jpg|css|js|ico))$
    static_files: dist/1
    upload: dist/(.*)
  - url: /assets/fonts/(.*.(eot|woff|woff2|svg))$
    static_files: dist/assets/fonts/1
    upload: dist/assets/fonts/(.*)
  - url: /.*
    static_files: dist/index.html
    upload: dist/index.html

相关内容

  • 没有找到相关文章

最新更新