注意:这个问题与此有关,但是两年在Go历史上是很长的时间。
在开发过程中组织Go项目的标准方法是什么?
我的项目是一个包mypack
,所以我想我将所有.go文件放在一个mypack
目录中。
但是,然后,我想在开发过程中对其进行测试,因此至少需要一个声明该main
包的文件,以便我可以go run trypack.go
我应该如何组织呢?go install mypack
每次尝试都需要做吗?
注意:这个问题与此有关,但是两年在Go历史上是很长的时间。
在开发过程中组织Go项目的标准方法是什么?
我的项目是一个包mypack
,所以我想我将所有.go文件放在一个mypack
目录中。
但是,然后,我想在开发过程中对其进行测试,因此至少需要一个声明该main
包的文件,以便我可以go run trypack.go
我应该如何组织呢?go install mypack
每次尝试都需要做吗?
Answers:
我建议阅读有关如何编写Go代码的页面
它记录了如何以go build
友好的方式构建项目以及如何编写测试。使用该main
程序包不必进行cmd测试。它们可以简单地被TestX命名为每个程序包的一部分,然后go test
发现它们。
现在,随着Go 1的发布,问题中该链接中建议的结构有些过时了,您不再需要在pkg
目录下放置目录src
。仅有3个与规范相关的目录是GOPATH根目录中的3个目录:bin,pkg,src。在src之下,您可以简单地放置您的项目mypack
,并且在其下是所有.go文件,包括mypack_test.go
go build
然后将其构建到根级别pkg和bin中。
因此,您的GOPATH可能如下所示:
~/projects/
bin/
pkg/
src/
mypack/
foo.go
bar.go
mypack_test.go
export GOPATH=$HOME/projects
$ go build mypack
$ go test mypack
更新:从> = Go 1.11开始,模块系统现在已成为工具的标准部分,并且GOPATH概念已接近过时。
~
,例如busybox bourne外壳也会扩展。自己尝试:export BOB=~ && env | grep ^BOB
会屈服BOB=/your/homedir
$HOME
然后在更多的炮弹中工作~
,例如在fish
我研究了许多Go项目,并且有很多变化。您可以分辨出谁来自C和谁来自Java,因为前者几乎将main
包中项目根目录中的所有内容转储,而后者往往将所有内容都放在src
目录中。但是,这都不是最佳选择。每一种都有其后果,因为它们会影响导入路径以及其他人如何重用它们。
为了获得最佳结果,我制定了以下方法。
myproj/
main/
mypack.go
mypack.go
哪里mypack.go
是package mypack
和main/mypack.go
是(明显)package main
。
如果您需要其他支持文件,则有两种选择。要么将它们全部保留在根目录中,要么将私有支持文件放置在lib
子目录中。例如
myproj/
main/
mypack.go
myextras/
someextra.go
mypack.go
mysupport.go
要么
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
,例如go build main/mypack
。如果您有多个可执行文件,则也可以将其分开,main
而不必创建单独的项目。例如main/myfoo/myfoo.go
和main/mybar/mybar.go
。
cmd/nameOfMyExecutable
将为主软件包使用一个子目录(仅cmd/…
在您有多个命令时才需要;请参见golang.org/x/tools/cmd
;否则,经常main.go
在顶层交换它并在顶层使用)。您拥有的方式go install
将创建一个“ main”(或“ main.exe”)可执行文件。同样,惯用方法是internal
在程序包/程序内部的子程序包中使用一个子目录,该子目录不打算在其他地方使用(预计Go的未来版本将不会再强制其他人以internal
这种方式导入程序包)。
我对了解如何在Golang中组织代码非常有用,本章由Caleb Doxsey撰写,该书http://www.golang-book.com/11
似乎没有组织Go项目的标准方法,但是https://golang.org/doc/code.html指定了大多数项目的最佳实践。jdi的回答很好,但是如果您使用github或bitbucket并且还具有其他库,则应创建以下结构:
~/projects/
bin/
pkg/
src/
github.com/
username/
mypack/
foo.go
bar.go
mypack_test.go
mylib/
utillib.go
utillib_test.go
通过这种方式,您可以为mylib创建一个单独的存储库,该存储库可用于其他项目,并且可以通过“ go get”进行检索。您的mypack项目可以使用“ github.com/username/mylib”导入您的库。想要查询更多的信息:
http://www.alexvictorchan.com/2014/11/06/go-project-structure/
将文件保留在同一目录中,并package main
在所有文件中使用。
myproj/
your-program/
main.go
lib.go
然后运行:
~/myproj/your-program$ go build && ./your-program
让我们探究该go get repository_remote_url
命令如何在下管理项目结构$GOPATH
。如果执行此操作go get github.com/gohugoio/hugo
,它将在以下位置克隆存储库
$ GOPATH / src / repository_remote / user_name / project_name
$ GOPATH / src / github.com/gohugoio/hugo
这是创建初始项目路径的好方法。现在,让我们探索那里的项目类型是什么以及它们的内部结构如何组织。社区中的所有golang项目都可以归类为
Libraries
(无可执行二进制文件)Single Project
(仅包含1个可执行二进制文件)Tooling Projects
(包含多个可执行二进制文件)通常,golang项目文件可以按照任何设计原则打包,例如DDD,POD
大多数可用的go项目都遵循此面向包的设计
面向包的设计鼓励开发人员将实现仅保留在自己的包中,而不是/internal
那些包之间无法通信的包
/internal
包主要用于隐藏其他项目的实现。 ~/$GOPATH/
bin/
pkg/
src/
repository_remote/
user_name/
project_name/
internal/
other_pkg/
cmd/
软件包管理我们要构建的二进制文件(工具)的数量 ~/$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/