Go App Engine在没有Context的init()中获取版本

时间:2017-02-09 23:16:29

标签: google-app-engine go

有没有办法在没有class Employee { static hasOne = [user:User, vpn:Vpn, tenrox:Tenrox, machine: Machine, dbuser:DbUser]; static mapping = { version false id generator: 'assigned',type: 'string' } String id // Declares id as String String name String designation String team Long contact_no static constraints = { name(nullable: false,maxSize:100) designation(nullable: true,maxSize:40) team(nullable: true,maxSize:40) contact_no(nullable: true,maxSize:20) } }的情况下在我的func sq(in <-chan int) <-chan int { out := make(chan int) go func() { for number := range in { out <- number * number } close(out) }() return out } 函数中获取自动标量应用程序的VersionID?唯一可用的选项似乎是init()。手动缩放的实例在启动时调用Context(允许访问appengine.VersionID(context.Context)),但对于自动调整的实例没有这样的内容。

我并不关心/_ah/start返回的生成ID,只是app.yaml版本。

编辑:一点上下文:我想以x-x-x-dev或x-x-x-live的形式部署版本,并且我的数据库连接取决于版本后缀。这样,当我查看GCP控制台时,我可以确定哪些部署的模块/服务正在使用哪个数据库。当然,我在Context中设置了我的数据库连接池,该连接池无法访问appengine.VersionID

1 个答案:

答案 0 :(得分:1)

我在网上搜索和搜索没有任何答案,所以就在这里。

只需解析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
}

请注意,这不会以appengine.VersionID()所做的X.Y形式返回生成的ID。只有版本的X部分。

顺便说一下,在Github上的appengine repo中,对appengine.VersionID的实际调用需要Context,但在内部使用nil调用内部包。所以他们基本上强迫你用Context来调用它,但实际上并没有使用它。令人难以置信的是真气。

编辑:应该注意的是,gcloud中的新Go SDK不再支持app.yaml中的version,因为它现在是部署时的必需参数。然而,&#34;遗产&#34; SDK仍然受支持和维护,我将在今天(12/24/2018)继续使用。