构建一个多可执行的Go项目

时间:2018-10-28 19:32:09

标签: go aws-lambda structure microservices go-modules

我正在尝试在Go中构建一个微服务架构项目。我目前正在使用支持模块的Go 1.11,因此我将根目录放在GOPATH之外的任意选择的目录中。

如果我正确理解了微服务体系结构的概念,尽管我的微服务需要独立,但是它们可以共享依赖项(我看不到其他做事的方法,对吗?)

下面是我的目录结构:

.
├── go.mod
├── lambda
│   └── account_create
│       └── main.go
├── readme.md
└── types
    ├── account.go
    ├── location.go
    ├── order.go
    ├── pricing.go
    ├── product.go
    └── types.go

现在,我期望的行为是能够运行go build lambda/account_create并获得具有该功能的可执行文件,因此我可以将其提供给相应的AWS Lambda函数。

但是,当我运行命令时,我得到:

can't load package: package lambda/account_create: unknown import path "lambda/account_create": cannot find module providing package lambda/account_create

请向我解释为什么这种方法不起作用,并就此类项目的外观给我一些建议。

非常感谢您!

编辑,这是我的lambda/account_create/main.go文件内容:

package account_create

import (
    "fmt"
    "roasted.ro/pkg/types"
)

func main() {
    account := types.UserAccount{Name: "Victor"}
    fmt.Printf("Welcome %s", account.Name)
}

1 个答案:

答案 0 :(得分:2)

要回答问题的后半部分(因为上半部分更多是关于偏好),您需要执行以下操作:

go build ./lambda/account_create

请注意./go build接受软件包名称或路径。如果您未在路径前添加./,则假定您为其指定了程序包名称。

编辑:要获取可执行文件,程序包必须为main。根据{{​​3}},对于构建可执行文件的项目,您始终必须使用package main

  

可执行命令必须始终使用package main

编辑:我将在布局上添加一些意见:

请考虑将项目的哪些部分导出到其他go项目。这意味着有人可以导入您的软件包并期望获得增值,并且在您进行更改时不会破坏他们的代码。

它应该放在github.com/you/pkg/somepath包中,也可以放在github.com/you/somepath中。

除主软件包外,其他所有内容都应位于/internal软件包下。

我通常为每个可执行文件制作一个/cmd/myexecurable1 /cmd/myexecurable2,依此类推。