如何在Beanstalk中部署具有自定义项目文件夹结构的Go web应用程序



我是Go新手。我正在尝试将一个简单的web项目部署到EB,但没有成功。我想将具有以下本地结构的项目部署到Amazon EB:

$GOPATH
├── bin
├── pkg
└── src
├── github.com
│   ├── AstralinkIO 
│   │   └── api-server <-- project/repository root
│   │       ├── bin
│   │       ├── cmd <-- main package
│   │       ├── pkg
│   │       ├── static
│   │       └── vendor

但我不知道如何做到这一点,在构建命令时,Amazon将api-server视为$GOPATH,当然import路径已断开。

我读到,大多数时候,最好将所有转发都放在同一个工作区下,但这会使部署更加困难。。

我使用ProcfileBuildfile来自定义输出路径,但找不到依赖关系的解决方案。

将此类项目部署到EB的最佳方式是什么?

我使用Beanstalk已经很久了,所以我对细节有点生疏。但基本思想如下。AWS Beanstalk对go的支持在设计上有点奇怪。它基本上将您的源文件提取到服务器上的一个文件夹中,将该文件夹声明为GOPATH,并尝试构建您的应用程序,假设您的主包位于GOPATH的根。这不是go项目的标准布局。所以你的选择是:

1) 将您的整个GOPATH打包为Beanstalk的"源捆绑包"。然后,您应该能够编写build.sh脚本来更改GOPATH并按照自己的方式构建它。然后从构建文件中调用build.sh。

2) 将主程序包更改为常规程序包(例如github.com/AstralinkIO/api-server/cmd)。然后在GOPATH的根目录下创建一个application.go文件(是的,在src之外,而所有实际的包都在src中)。你的application.go将成为你的"package main",并且只包含一个main函数(它将从github.com/AstralinkIO/api-server/cmd调用你当前的main函数)。应该做这个把戏。尽管你的里程数可能会有所不同。

3) 更简单的选择是使用基于Docker的Go平台。它仍然在服务器上构建你的go应用程序,但与上面的问题基本相同,但它有更好的文档记录,在本地测试它的可能性有助于正确配置和构建。它还将为您提供一些关于Beanstalk如何构建go应用程序的见解,从而有助于选择1和2。我自己使用了这个选项,直到我转移到普通的EC2实例。我仍然使用由此获得的技能来使用docker构建我当前的应用程序版本。

4) 不过,你最好的选择(在我看来)是自己构建应用程序,并将其打包为一个可运行的二进制文件。请参阅此处的第二个要点段落

好吧,无论你选择哪个选项——祝你好运!

最新更新