2017-02-09 108 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来称呼它,但它并没有被实际使用。这令人难以置信的令人难以置信。

相关问题