仅在部署时生成错误:无法使用 appengine.AccessToken
Build error on deploy only: cannot use appengine.AccessToken
我正在编写的一个简单的 Go GAE(灵活)应用程序在我引入 cloud.google.com 包以使用 Google 服务后无法立即部署。部署日志的片段:
...
golang.org/x/oauth2/google
# golang.org/x/oauth2/google
_gopath/src/golang.org/x/oauth2/google/appengine_hook.go:12: cannot use appengine.AccessToken (type func(appengine.Context, ...string) (string, time.Time, error)) as type func("golang.org/x/net/context".Context, ...string) (string, time.Time, error) in assignment
_gopath/src/golang.org/x/oauth2/google/appengine_hook.go:13: cannot use appengine.AppID (type func(appengine.Context) string) as type func("golang.org/x/net/context".Context) string in assignment
...
这可以通过 go install -v -tags appenginevm
在要部署的应用程序中本地复制。该应用程序在没有 appenginevm
标记的情况下构建并运行良好。
我刚刚按照 helloworld 示例进行了修改,但找不到其他人遇到这个问题(一些 Google 搜索没有找到任何有用的信息)。
有人知道如何解决这个问题/我遗漏了什么吗?
提前致谢。完整程序如下。
package main
import (
"context"
"fmt"
"log"
"net/http"
"time"
"cloud.google.com/go/storage"
)
var (
client *storage.Client
)
func main() {
ctx := context.Background()
var err error
client, err = storage.NewClient(ctx)
if err != nil {
log.Fatal(err)
return
}
defer client.Close()
http.HandleFunc("/_ah/health", healthCheckHandler)
http.HandleFunc("/", indexHandler)
log.Print("Listening on http://localhost:8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
func httpError(w http.ResponseWriter, err error) {
log.Println(err)
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
}
func healthCheckHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "OK")
}
func indexHandler(w http.ResponseWriter, r *http.Request) {
start := time.Now()
finish := time.Since(start)
fmt.Fprintf(w, "Done %v %v", finish)
}
这是app.yaml
env: flex
runtime: go
你可能应该使用
import "golang.org/x/net/context"
而不是
import "context"
原来我本地有一个旧版本的 "google.golang.org/appengine" 包,我不知道的是 "gcloud app deploy" 命令似乎上传了所有这些依赖项而不是解析远程依赖。
所以我这个库的旧本地副本破坏了远程编译过程。
我完全出于好奇 运行 "go get -u google.golang.org/appengine" 想出了这个,但失败了:
package google.golang.org/appengine: google.golang.org/appengine is a custom import path
for https://github.com/golang/appengine, but
$GOPATH/src/google.golang.org/appengine is checked out from
https://github.com/golang/appengine.git
所以我核对了它并得到了一个新的副本,现在一切正常了。
TL;DR 如果您遇到远程编译错误,请确保您的本地包都是最新的。
我正在编写的一个简单的 Go GAE(灵活)应用程序在我引入 cloud.google.com 包以使用 Google 服务后无法立即部署。部署日志的片段:
...
golang.org/x/oauth2/google
# golang.org/x/oauth2/google
_gopath/src/golang.org/x/oauth2/google/appengine_hook.go:12: cannot use appengine.AccessToken (type func(appengine.Context, ...string) (string, time.Time, error)) as type func("golang.org/x/net/context".Context, ...string) (string, time.Time, error) in assignment
_gopath/src/golang.org/x/oauth2/google/appengine_hook.go:13: cannot use appengine.AppID (type func(appengine.Context) string) as type func("golang.org/x/net/context".Context) string in assignment
...
这可以通过 go install -v -tags appenginevm
在要部署的应用程序中本地复制。该应用程序在没有 appenginevm
标记的情况下构建并运行良好。
我刚刚按照 helloworld 示例进行了修改,但找不到其他人遇到这个问题(一些 Google 搜索没有找到任何有用的信息)。
有人知道如何解决这个问题/我遗漏了什么吗?
提前致谢。完整程序如下。
package main
import (
"context"
"fmt"
"log"
"net/http"
"time"
"cloud.google.com/go/storage"
)
var (
client *storage.Client
)
func main() {
ctx := context.Background()
var err error
client, err = storage.NewClient(ctx)
if err != nil {
log.Fatal(err)
return
}
defer client.Close()
http.HandleFunc("/_ah/health", healthCheckHandler)
http.HandleFunc("/", indexHandler)
log.Print("Listening on http://localhost:8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
func httpError(w http.ResponseWriter, err error) {
log.Println(err)
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
}
func healthCheckHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "OK")
}
func indexHandler(w http.ResponseWriter, r *http.Request) {
start := time.Now()
finish := time.Since(start)
fmt.Fprintf(w, "Done %v %v", finish)
}
这是app.yaml
env: flex
runtime: go
你可能应该使用
import "golang.org/x/net/context"
而不是
import "context"
原来我本地有一个旧版本的 "google.golang.org/appengine" 包,我不知道的是 "gcloud app deploy" 命令似乎上传了所有这些依赖项而不是解析远程依赖。
所以我这个库的旧本地副本破坏了远程编译过程。
我完全出于好奇 运行 "go get -u google.golang.org/appengine" 想出了这个,但失败了:
package google.golang.org/appengine: google.golang.org/appengine is a custom import path
for https://github.com/golang/appengine, but
$GOPATH/src/google.golang.org/appengine is checked out from
https://github.com/golang/appengine.git
所以我核对了它并得到了一个新的副本,现在一切正常了。
TL;DR 如果您遇到远程编译错误,请确保您的本地包都是最新的。