【问题标题】:How to correctly import Golang appengine?如何正确导入 Golang 应用引擎?
【发布时间】:2015-11-23 02:54:23
【问题描述】:

在我用 Go 编写的 Google App Engine 项目中,我一直在使用例如

import "appengine/datastore"

成功了很长时间,并假设导入找到了我拥有 App Engine SDK 的东西。但是,现在我想使用 Google 的第三方库,该库也使用 App Engine 中的内容,但使用完整路径导入:

import "google.golang.org/appengine"

运行应用程序

$ goapp serve

找不到 appengine 失败:

...go/src/golang.org/x/oauth2/client_appengine.go:16: can't find import: "google.golang.org/appengine/urlfetch"

Can't find package "google.golang.org/appengine" in $GOPATH

显然,我想使用相同的 App Engine 部件,以免出现其他问题。我的第一个想法是我想告诉第三方库使用 App Engine SDK 库,但我不知道如何,因为它在导入中有不同的前缀。

我应该在我的项目中为所有 App Engine 导入使用完整路径吗?这与我在 Google 的 App Engine for Golang 网页上阅读的所有内容相反。例如。 here.

一般来说,如何设置才能在 App Engine 的开发和生产以及第三方库中找到正确的 appengine 库?

提前感谢您的帮助!

更新

我还可以看到,在添加第三方库并运行go get 后,它会将各种内容提取到$GOPATH/src/google.golang.org/api/... 中。那里有很多东西,还有 appengine 等等。似乎都是 Golang Google API...!

所以它没有解决,但我了解到有一个更改为 fully qualified appengine import paths

现在我的应用在本地运行,因为我引入了新的 appengine 以满足使用新导入路径的 oauth 库。

go get google.golang.org/appengine

根据this

如果您不想更新整个应用以使用新的 App Engine 软件包,您可以同时使用两组软件包,仅使用带有 oauth2 软件包的新软件包。

实际上非常混乱,我不知道在 App Engine 上部署时有什么可用的。有人知道吗?

【问题讨论】:

  • 我很困惑。这解决了吗?仅仅是因为您从未获取过依赖项吗?
  • 你试过import "appengine"吗?我假设 Go 应该从 $GOPATH 实现而不明确说明完整路径。
  • 它没有解决 - 阅读它并在这里找到一些东西:github.com/golang/appengine#2-update-import-paths
  • 看起来 appengine 正在过渡到完全合格的导入路径,因此存在很多不一致之处......

标签: google-app-engine go dependencies


【解决方案1】:

如果您使用 gosdk,只需在 .go 文件所在的目录中运行 goapp get,它就会下载并安装依赖项到您的 gosdk 安装。然后您再次部署该应用程序,它应该可以毫无问题地编译。

运行时没有提示,文件会下载到gosdk\gopath\src

完成后会有一个可以忽略的警告信息:

去安装:目录没有安装位置 GOPATH 外的 C:\your_current_directory 更多详情见:go help gopath

【讨论】:

    【解决方案2】:

    就像您的更新所说的那样;您可以在弃用旧 API 并完成新 API 的同时(在同一块代码中)并行使用 两种类型的导入

    大多数 App Engine 服务都可以使用完全相同的 API。清理了一些 API,有些还没有。

    source,离你的一个链接更远一点)

    如果您需要同时使用appenginegoogle.golang.org/appengine,那么您可以为导入路径设置别名以实现此目的。比如:

    import (
       oldAppengine "appengine"
       "google.golang.org/appengine"
    )
    

    或者你想给他们起什么名字。

    如果在部署时某些内容不可用,您会在构建时遇到错误,并且不会部署到 App Engine,因此您不必担心。

    【讨论】:

    • 是的,这似乎是一种方式......只是让我想知道当你同时使用两者时是否有一些事情会变坏。例如。考虑相同的对象但大小不同...
    • 当然,如果您从一个包传递到另一个包,可能会有一些不稳定的实现细节不能很好地匹配。我认为,这个想法是只使用新旧包中的一个(例如,"appengine""google.golang.org/appengine")并一次一个地转换包。无论如何,您都不想使用旧的,因为它已被弃用,除非您使用的东西在较新的软件包中不起作用。但如果你不得不,我敢打赌,这些软件包可以共存一段时间。
    猜你喜欢
    • 2015-12-20
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2014-05-04
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多