2015-12-05 18 views
6

Aggiornamento: modules sono chiamati services questi giorni.Un servizio/modulo predefinito in un'app di Google App Engine può essere un fratello di uno non predefinito in termini di struttura di cartelle?

Vorrei organizzare i moduli del mio progetto in varie sottocartelle, in cui ogni sottocartella contiene il codice relativo a ciascun modulo. In particolare, vorrei che la cartella contenente il modulo predefinito fosse allo stesso livello degli altri moduli (cioè fossero tutti fratelli). Sto seguendo lo schema riportato nel Modules documentation:

diagram

Tuttavia, ciò che mi confonde è la dichiarazione "Important: The app.yaml file must be located in your application's root directory". Ciò implica che il modulo predefinito (e la sua app.yaml) deve essere nella directory root del progetto e, quindi, essere il genitore dei moduli non predefiniti?

risposta

14

I moduli possono essere tutti affiancati. Lo <module>.yaml per ognuno può trovarsi nella dir del modulo.

La nota sul file app.yaml è fuorviante, si applica in realtà solo alle app a modulo singolo (molte parti della documentazione non sono state aggiornate per app multi-modulo).

Il file di configurazione del modulo default non deve nemmeno essere chiamato app.yaml (o la sua dir chiamata default). Manterrei i file di configurazione a livello di app (cron.yaml, dispatch.yaml, queue.yaml e index.yaml) al livello più alto, eventualmente collegandoli in modo simbolico ai moduli predefiniti (o ad altri) come necessario (alcuni strumenti potrebbero reclamare diversamente).

Ecco, per esempio, la struttura ho avuto modo di una delle mie applicazioni (la dir main contiene il modulo 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 

Hai solo bisogno di prestare attenzione quando si richiama i relativi strumenti. Questo è il mio cheat-sheet per quella app, eseguito dal dir della app, alcune delle quali si riflette anche nella configurazione di progetto PyCharm (sto correndo il server di sviluppo all'interno 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> . 

Per eseguire il devserver :

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

Aggiornamento: aggiunti alcuni dei miei file di configurazione, come richiesto.

Il dispatch.yaml di file, curando l'instradamento del modulo buildin sia sul dominio AppSpot e il mio dominio personalizzato (tutto il resto viene instradato automaticamente al modulo predefinito):

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

Il file 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" 

Il buildin.yaml del file:

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" 
+0

Grazie per il chiarimento e per aver fornito l'esempio insieme al cheat sheet. E 'molto utile. –

+0

@dan, puoi incollare nel tuo codice dispatch.yaml + main/main.yaml + buildin/buildin.yaml? – WebQube

+0

@Kevin Lee, non sono ancora in grado di capire come ottenere questo errore. google.appengine.api.yaml_errors.EventError: attributo 'dispatch' non previsto per l'oggetto di tipo AppInfoExternal. in "./app.yaml", riga 3, colonna 3 Per favore datemi un codice funzionante, se possibile. [email protected] –