构建一个多可执行的 Go 项目
Structuring a multi-executable Go project
我正在尝试用 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)
}
要回答你问题的后半部分(因为前半部分更多是关于偏好),你需要做:
go build ./lambda/account_create
注意 ./
。 go build
接受包名或路径。如果您不在路径前加上 ./
,它会假设您给它一个包名。
编辑:如果你想要一个可执行文件,包必须是main
。根据 docs,对于构建可执行文件的项目,您始终必须使用 package main
:
Executable commands must always use package main
.
编辑: 我会在布局上添加一些意见:
考虑将项目的哪些部分导出到其他 Go 项目。这意味着有人可以导入您的包并期望获得价值并且不会在您的更改时破坏他们的代码。
那应该在 github.com/you/pkg/somepath
包中或只是 github.com/you/somepath
。
其他任何东西(主包除外)都应该在 /internal
包下。
我通常为每个可执行文件制作 /cmd/myexecurable1
/cmd/myexecurable2
等等。
我正在尝试用 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)
}
要回答你问题的后半部分(因为前半部分更多是关于偏好),你需要做:
go build ./lambda/account_create
注意 ./
。 go build
接受包名或路径。如果您不在路径前加上 ./
,它会假设您给它一个包名。
编辑:如果你想要一个可执行文件,包必须是main
。根据 docs,对于构建可执行文件的项目,您始终必须使用 package main
:
Executable commands must always use
package main
.
编辑: 我会在布局上添加一些意见:
考虑将项目的哪些部分导出到其他 Go 项目。这意味着有人可以导入您的包并期望获得价值并且不会在您的更改时破坏他们的代码。
那应该在 github.com/you/pkg/somepath
包中或只是 github.com/you/somepath
。
其他任何东西(主包除外)都应该在 /internal
包下。
我通常为每个可执行文件制作 /cmd/myexecurable1
/cmd/myexecurable2
等等。