就文件夹结构而言,Google App Engine 应用程序中的默认服务/模块可以是非默认服务/模块的兄弟吗?

Posted

技术标签:

【中文标题】就文件夹结构而言,Google App Engine 应用程序中的默认服务/模块可以是非默认服务/模块的兄弟吗?【英文标题】:Can a default service/module in a Google App Engine app be a sibling of a non-default one in terms of folder structure? 【发布时间】:2016-03-10 16:11:56 【问题描述】:

更新:modules 现在被称为 services

我想将我项目的模块组织到不同的子文件夹中,其中每个子文件夹都包含与每个模块相关的代码。特别是,我希望包含默认模块的文件夹与其他模块处于同一级别(即它们都是兄弟姐妹)。我按照Modules documentation中显示的图表:

(来源:google.com)

然而,令我困惑的是“Important: The app.yaml file must be located in your application's root directory”这句话。这是否意味着默认模块(及其 app.yaml)必须位于项目根目录中,因此是非默认模块的父级?

【问题讨论】:

【参考方案1】:

所有模块都可以并排放置。每个<module>.yaml 可以在模块目录中。

关于app.yaml 文件的注释具有误导性,它实际上仅适用于单模块应用程序(许多文档没有针对多模块应用程序进行更新)。

default 模块的配置文件甚至不必称为app.yaml(或其目录称为default)。我会将应用程序级别的配置文件(cron.yamldispatch.yamlqueue.yamlindex.yaml)保留在顶层,最终根据需要将它们符号链接到默认(或其他)模块(一些否则工具可能会抱怨)。

例如,这是我的一个应用程序的结构(main 目录包含default 模块):

cron.yaml
dispatch.yaml
queue.yaml
index.yaml
main/cron.yaml -> ../cron.yaml
main/index.yaml -> ../index.yaml
main/main.yaml
main/queue.yaml -> ../queue.yaml
buildin/buildin.yaml
buildin/index.yaml -> ../index.yaml
buildin/queue.yaml-> ../queue.yaml

您只需要在调用相关工具时注意。这是该应用程序的备忘单,从应用程序的目录执行,其中一些也反映在 pycharm 项目配置中(我在 pycharm 中运行开发服务器):

appcfg.py update main/main.yaml buildin/buildin.yaml
appcfg.py update_dispatch .
appcfg.py update_indexes -A <app-name> main
appcfg.py update_cron -A <app-name> .
appcfg.py update_queues -A <app-name> .

运行开发服务器:

dev_appserver.py --host 0.0.0.0 --log_level=debug dispatch.yaml main/main.yaml buildin/buildin.yaml

更新:按要求添加了我的一些配置文件。

dispatch.yaml 文件,负责 apppot 域和我的​​自定义域上的 buildin 模块路由(其他所有内容都会自动路由到默认模块):

application: <my_app>
dispatch:
  - url: "buildin.my_domain.com/*"
    module: buildin
  - url: "buildin-dot-my_app.appspot.com/*"
    module: buildin
  - url: "*/buildin/*"
    module: buildin

main.yaml 文件:

application: my_app
module: default
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:

- url: /(.*\.min\.css)$
  static_files: stylesheets/\1
  upload: stylesheets/.*\.min\.css$
  secure: always

- url: /(.*\.(ico|gif|png|jpg|svg))$
  static_files: images/\1
  upload: images/.*\.(ico|gif|png|jpg|svg)$
  secure: always

- url: .*
  script: main.app
  secure: always

libraries:
- name: webapp2
  version: "2.5.2"
- name: jinja2
  version: "2.6"
- name: pycrypto
  version: "2.6"

buildin.yaml 文件:

application: my_app
module: buildin
version: 1
runtime: python27
api_version: 1
threadsafe: true
instance_class: B2

handlers:

- url: /(.*\.min\.js)$
  static_files: scripts/\1
  upload: scripts/.*\.min\.js$
  secure: always

- url: /(.*\.min\.css)$
  static_files: stylesheets/\1
  upload: stylesheets/.*\.min\.css$
  secure: always

- url: /(.*\.(ico|gif|png|jpg|svg))$
  static_files: images/\1
  upload: images/.*\.(ico|gif|png|jpg|svg)$
  secure: always

- url: /buildin/cron*
  script: buildin.app
  login: admin

- url: .*
  script: buildin.app
  secure: always

libraries:
- name: webapp2
  version: "2.5.2"
- name: jinja2
  version: "2.6"
- name: pycrypto
  version: "2.6"

【讨论】:

感谢您的澄清并提供示例以及备忘单。非常有用。 @dan ,你能粘贴到你的 dispatch.yaml + main/main.yaml + buildin/buildin.yaml 代码吗? @Kevin Lee,我仍然无法弄清楚这个错误。 google.appengine.api.yaml_errors.EventError:AppInfoExternal 类型对象的意外属性“调度”。在“./app.yaml”第 3 行第 3 列中,如果可能的话,请给我一个工作代码。 sirimala.sreenath@gmail.com @sreenathsirimala:作为一个单独的问题提出。包括整个跟踪和 yaml 文件的内容。

以上是关于就文件夹结构而言,Google App Engine 应用程序中的默认服务/模块可以是非默认服务/模块的兄弟吗?的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine 不提供静态文件

在Google App Engine Standard中配置嵌套的静态文件夹 - PHP环境

Google App Engine 的项目结构

PHP Google App Engine YAML 找不到目录

Hello Django

Google App Engine:如何使用相同的父目录创建静态和动态文件?例如dir / css&dir / python?