【问题标题】:Can't Deploy Go app Error 422 to AppEngine无法将 Go 应用程序错误 422 部署到 AppEngine
【发布时间】:2016-10-14 20:23:18
【问题描述】:

突然无法将 Go 应用部署到 GAE。没有更改任何代码并且在本地工作正常。

03:39 PM 错误 422:--- 开始服务器输出 --- 编译失败: 2016/10/14 12:39:46 go-app-builder: 解析输入失败: package main 必须是顶级包 --- 端服务器输出 ---

因为它是一个云应用程序,所以我没有主包 - 几天前一切都很好。我在 Windows 10 上,并在几天前获得并更新...
我确实更新到了最新的 Go Cloud SDK,但得到了同样的错误。

【问题讨论】:

  • 你可以包含你运行的命令来部署吗?
  • goapp deploy 云支持技术确实回复说正在调查“正在进行的问题”。他让我运行这个命令:gcloud app deploy --verbosity=debug --log-http ...它没有运行:错误:(gcloud)无效的选择:'app'。您指的是 'auth' 吗?但这也不运行...
  • 我猜这个问题还在继续。支持人员说要更新 GCloud SDK。我认为它会在更新 GAE Go SDK 时更新 - 不是吗?无论如何,我不想使用 GCloud,因为我想保持相同的版本号并且无法弄清楚如何通过 GCloud 更新来做到这一点(因为它破坏了位于我网站前面的广告代理服务器) .我将不得不为 Silver Support 支付每月 125 美元的费用 - 以了解是否仍然存在持续存在的问题以及如何解决它。让这成为我的一个教训。
  • 呃哦,现在是 150 美元,而且有点乱。它会将您带到没有 GCloud/GAE 支持类别的支持页面表单。我向 G Suite 团队发送了请求,并要求他们转发到 GCloud...
  • 哎呀!我提交了一张票,得到了 GSuite 的回复,GSuite 转发了它 GCloud 支持。给我一个链接,并说要发布对票的回复 - 但现在它已经消失了!无论如何,希望我能收到 GCloud 支持的消息。

标签: google-app-engine go


【解决方案1】:

您的应用程序目录中是否有任何未导入的子目录可能包含主包?我已经得出结论 go-app-builder 正在应用相当于 go tool vet ./... (而不是 go tool vet 。)并且使用的是旧版本。我最近在部署时开始遇到此错误:

01:05 PM Error 422: --- begin server output ---
Compile failed:
2016/10/19 10:05:23 go-app-builder: Failed parsing input (2 errors)
2016/10/19 10:05:23 appleasn1.go:16:25: composite struct literal encoding/asn1.ObjectIdentifier with unkeyed fields
2016/10/19 10:05:23 appleasn1.go:17:25: composite struct literal encoding/asn1.ObjectIdentifier with unkeyed fields
--- end server output ---
01:05 PM Rolling back the update.

asn1.ObjectIdentifier 是 []int 的别名,因此这不是复合结构字面量。这个bug in vet was fixed six months ago。我与 GCloud 支持人员分享了我的发现,他们向我保证他们会这样做。作为一种解决方法,我让我的代码通过了过于严格的审查程序。如果您的应用中有一个包含 main 包的子目录,您可以在 app.yaml 中使用 skip_files 指令将其排除:

skip_files:
- bench/.*
- testdata/.*

复合错误的修复涉及从这里更改:

oidData = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 7, 1}

到这里:

oidData = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 7, 1})

【讨论】:

    【解决方案2】:

    已编辑:

    此问题源于 App Engine Standard 的新功能,即应用可以为其自己的主包提供 main 函数,如我们的公开 Google Groups post 中所述。解决方法是将nobuild_files: commands/.* 添加到您的“app.yaml”中。对此的官方修复将在下一个 SDK 1.9.47 中发布。

    同时,如果您有一个“main.go”文件,请确保它与您正在部署的目录级别相同(也称为顶级包)。还要确保您在主函数中提供所需的appengine.Main(),如source code 中所述。

    我还建议在“main.go”顶部添加// +build !appengine,如helloworld 示例所示。这将告诉 App Engine 跳过尝试上传或编译任何未使用的代码,这也可能是部署失败的原因。

    【讨论】:

    • SDK 的当前版本号是 1.9.40 - 当我尝试更新我的代码时,它抱怨“顶级主包被禁止”。
    • 我注意到源代码中的“// App Engine Standard 尚不支持 Main”行。 spazzy 版本是怎么回事?为什么没有向后兼容性?为什么这样做导致我一个多星期都无法更新我的网站?
    • @JackScheper 源中关于“App Engine Standard 尚不支持 Main” 的评论正是 new change 正在纠正的内容。您是否遵循了我们上面链接的群组帖子中提供的解决方案列表?确保您的所有导入都来自 GOPATH,并且您已将推荐的 nobuild_files: commands/.* 添加到您的“app.yaml”中,这将确保您有适当的修复程序。我们即将发布的 1.9.46 SDK 版本将为您实施这些修复。
    • 我了解此更改将纠正此差异,但这不是突然中断流程的理由。已经 3 周了!
    • @JackScheper 我们的工程团队提供了更新的 ETA。该修复程序应在 1.9.47 SDK 中发布,该版本应在接下来的两周内发布。我已经更新了上面的答案,使其更加完整。
    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2017-11-27
    • 2021-03-23
    • 1970-01-01
    • 2021-01-15
    • 2016-09-12
    相关资源
    最近更新 更多