2017-02-09 44 views
0

有沒有辦法讓我的自動縮放應用程序的VersionID在我的init()函數中沒有Context?唯一可用的選項似乎是appengine.VersionID(context.Context)。手動縮放的實例在啓動時調用/_ah/start(允許訪問Context),但對於自動縮放實例沒有這樣的情況。Go App Engine在init()中獲取版本沒有上下文

我不關心appengine.VersionID返回的生成ID,只是app.yaml版本。

編輯:一點上下文:我想要部署x-x-x-dev或x-x-x-live版本的版本,並讓我的數據庫連接依賴於版本後綴。這樣,當我查看GCP控制檯時,我可以確定哪些已部署的模塊/服務正在使用哪個數據庫。當然,我在init()中設置了我的數據庫連接池,它無法訪問Context

回答

0

我搜索和搜索沒有答案在任何地方,所以在這裏。

只需解析您的init()函數中的app.yaml文件即可。我的例子在這裏使用了一個yaml解析包,但是如果你需要的話,它可以做得更輕量級。

import "github.com/ghodss/yaml" 

type AppVersion struct { 
    Version string `json:"version"` 
} 

func VersionID() (string, error) { 
    dat, err := ioutil.ReadFile("app.yaml") 
    if err != nil { 
     return "", err 
    } 
    a := &AppVersion{} 
    err = yaml.Unmarshal(dat, a) 
    if err != nil { 
     return "", err 
    } 
    return a.Version, nil 
} 

注意,這並不形式X.Y是appengine.VersionID()不會返回生成的ID。只有版本的X部分。

另外,在Github的appengine回購協議中,對appengine.VersionID的實際調用需要Context,但在內部調用內部程序包nil。所以他們基本上強迫你用Context來稱呼它,但它並沒有被實際使用。這令人難以置信的令人難以置信。