注意:这个问题和这个问题相关,但是两年在围棋历史上是很长的时间。
在开发过程中组织Go项目的标准方法是什么?
我的项目是一个单独的包mypack,所以我想我把所有的.go文件放在一个mypack目录中。
然后,我想在开发过程中测试它,所以我至少需要一个声明主包的文件,这样我就可以运行trypack。go
我该怎么组织呢?每次我都需要安装mypack吗?
注意:这个问题和这个问题相关,但是两年在围棋历史上是很长的时间。
在开发过程中组织Go项目的标准方法是什么?
我的项目是一个单独的包mypack,所以我想我把所有的.go文件放在一个mypack目录中。
然后,我想在开发过程中测试它,所以我至少需要一个声明主包的文件,这样我就可以运行trypack。go
我该怎么组织呢?每次我都需要安装mypack吗?
当前回答
让我们看看go get repository_remote_url命令如何管理$GOPATH下的项目结构。如果我们去获取github.com/gohugoio/hugo,它将克隆存储库
美元GOPATH / src / repository_remote / user_name / project_name
美元GOPATH / src / github.com/gohugoio/hugo
这是创建初始项目路径的好方法。现在,让我们探索一下有哪些项目类型,以及它们的内部结构是如何组织的。社区中所有的golang项目都可以分为
库(没有可执行二进制文件) 单个项目(只包含1个可执行二进制文件) 工具项目(包含多个可执行二进制文件)
一般来说,golang项目文件可以按照DDD、POD等任何设计原则进行打包
大多数可用的go项目都遵循这种面向包的设计
面向包设计鼓励开发人员只在自己的包中实现,而不是那些包之间不能通信的/内部包
库
诸如数据库驱动程序、qt等项目可以归入这一类。 一些库,如color,现在遵循扁平结构,没有任何其他包。 这些库项目大多管理一个名为internal的包。 /内部包主要用于对其他项目隐藏实现。 没有任何可执行二进制文件,因此没有包含main func的文件。
~/$GOPATH/
bin/
pkg/
src/
repository_remote/
user_name/
project_name/
internal/
other_pkg/
单项目
像hugo, etcd这样的项目在根级和中有一个单一的主函数。 目标是生成一个二进制文件
工具项目
kubernetes、go-ethereum等项目在一个名为cmd的包下组织了多个main func Cmd / package管理我们想要构建的二进制文件(工具)的数量
~/$GOPATH/
bin/
pkg/
src/
repository_remote/
user_name/
project_name/
cmd/
binary_one/
main.go
binary_two/
main.go
binary_three/
main.go
other_pkg/
其他回答
我建议你看看这篇关于如何编写Go代码的文章
它记录了如何以一种友好的方式构建你的项目,以及如何编写测试。测试不需要是一个使用主包的cmd。它们可以简单地是TestX命名的函数,作为每个包的一部分,然后go test将发现它们。
你问题中那个链接中建议的结构有点过时了,现在随着Go 1的发布。您不再需要在src下放置pkg目录。只有3个与规范相关的目录是GOPATH根目录中的3:bin、pkg、src。在src下面,你可以简单地放置你的项目mypack,下面是你所有的。go文件,包括mypack_test.go
去构建,然后构建到根级PKG和bin。
所以你的GOPATH可能是这样的:
~/projects/
bin/
pkg/
src/
mypack/
foo.go
bar.go
mypack_test.go
出口GOPATH = $ HOME /项目
$ go build mypack
$ go test mypack
更新:从>= Go 1.11开始,模块系统现在是工具的标准组成部分,GOPATH概念接近过时。
让我们看看go get repository_remote_url命令如何管理$GOPATH下的项目结构。如果我们去获取github.com/gohugoio/hugo,它将克隆存储库
美元GOPATH / src / repository_remote / user_name / project_name
美元GOPATH / src / github.com/gohugoio/hugo
这是创建初始项目路径的好方法。现在,让我们探索一下有哪些项目类型,以及它们的内部结构是如何组织的。社区中所有的golang项目都可以分为
库(没有可执行二进制文件) 单个项目(只包含1个可执行二进制文件) 工具项目(包含多个可执行二进制文件)
一般来说,golang项目文件可以按照DDD、POD等任何设计原则进行打包
大多数可用的go项目都遵循这种面向包的设计
面向包设计鼓励开发人员只在自己的包中实现,而不是那些包之间不能通信的/内部包
库
诸如数据库驱动程序、qt等项目可以归入这一类。 一些库,如color,现在遵循扁平结构,没有任何其他包。 这些库项目大多管理一个名为internal的包。 /内部包主要用于对其他项目隐藏实现。 没有任何可执行二进制文件,因此没有包含main func的文件。
~/$GOPATH/
bin/
pkg/
src/
repository_remote/
user_name/
project_name/
internal/
other_pkg/
单项目
像hugo, etcd这样的项目在根级和中有一个单一的主函数。 目标是生成一个二进制文件
工具项目
kubernetes、go-ethereum等项目在一个名为cmd的包下组织了多个main func Cmd / package管理我们想要构建的二进制文件(工具)的数量
~/$GOPATH/
bin/
pkg/
src/
repository_remote/
user_name/
project_name/
cmd/
binary_one/
main.go
binary_two/
main.go
binary_three/
main.go
other_pkg/
保持文件在同一目录下,并在所有文件中使用package main。
myproj/
your-program/
main.go
lib.go
然后运行:
~/myproj/your-program$ go build && ./your-program
jdi拥有关于使用GOPATH的正确信息。我想补充的是,如果你也想有一个二进制文件,你可能想要在目录中添加一个额外的级别。
~/projects/src/
myproj/
mypack/
lib.go
lib_test.go
...
myapp/
main.go
运行build myproj/mypack将构建mypack包及其依赖项 运行go build myproj/myapp将构建myapp二进制文件及其依赖项,其中可能包括mypack库。
我研究过许多围棋项目,其中有相当多的变化。你可以看出谁来自C,谁来自Java,因为前者将项目根目录中的所有内容转储到主包中,而后者倾向于将所有内容放在src目录中。然而,这两种方法都不是最佳的。每种方法都会产生后果,因为它们会影响导入路径以及其他人如何重用它们。
为了得到最好的结果,我想出了以下方法。
myproj/
main/
mypack.go
mypack.go
mypack的地方。Go是package mypack和main/mypack。Go显然是包的主体。
如果你需要额外的支持文件,你有两个选择。要么将它们全部保存在根目录中,要么将私有支持文件放在lib子目录中。如。
myproj/
main/
mypack.go
myextras/
someextra.go
mypack.go
mysupport.go
Or
myproj.org/
lib/
mysupport.go
myextras/
someextra.go
main/
mypack.go
mypage.go
只有当文件不打算被另一个项目导入时,才将它们放在lib目录中。换句话说,如果它们是私有支持文件。这就是lib背后的思想——将公共接口与私有接口分开。
这样做将为您提供一个良好的导入路径myproj.org/mypack,以便在其他项目中重用代码。如果使用lib,则内部支持文件将有一个指示性的导入路径myproj.org/lib/mysupport。
在构建项目时,使用main/mypack,例如去构建main/mypack。如果你有多个可执行文件,你也可以在main下分离它们,而不必创建单独的项目。如主要/ myfoo / myfoo。去main/mybar/mybar。去。