组织一个多文件Go项目
注意:这个问题跟这个有关,但是两年在Go的历史上已经很长时间了。
在开发过程中组织Go项目的标准方式是什么?
我的项目是一个单独的包mypack
,所以我想我把所有mypack
文件放在一个mypack
目录下。
但是,我想在开发过程中testing它,所以我至less需要一个文件来声明main
包,这样我就可以go run trypack.go
我应该如何组织这个? 每次我想尝试一下,我需要go install mypack
吗?
我会build议阅读如何写代码的这个网页
它logging了如何以友好的方式go build
项目,以及如何编写testing。 testing不需要是使用main
包的cmd。 他们可以简单地将TestX命名为函数作为每个包的一部分,然后go test
会发现它们。
在你的问题中的链接build议的结构已经过时了,现在随着Go 1的发布。你不再需要在src
下放置一个pkg
目录。 只有3个规范相关的目录是你的GOPATH的根目录中的3:bin,pkg,src。 在src下面,你可以简单地放置你的项目mypack
,在它下面是你所有的.go文件,包括mypack_test.go
go build
将构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
jdi有关于使用GOPATH
的正确信息。 我想补充一点,如果你打算有一个二进制文件,你可能需要在目录中增加一个额外的层次。
~/projects/src/ myproj/ mypack/ lib.go lib_test.go ... myapp/ main.go
运行go build myproj/mypack
将构buildmypack
包以及它的依赖项运行go build myproj/myapp
将构buildmyapp
二进制文件以及它的可能包含mypack
库的依赖文件。
我已经学习了一些Go项目,并且有一些变化。 你可以告诉谁来自C,谁来自Java,因为前者只是转储main
包中的项目根目录中的所有内容,而后者倾向于将所有内容都放在src
目录中。 然而,两者都不是最佳的。 每个人都有后果,因为他们影响importpath,以及他人如何重用他们。
为了得到最好的结果,我制定了以下方法。
myproj/ main/ mypack.go mypack.go
mypack.go
是mypack.go
的package mypack
而main/mypack.go
(显然)是package main
。
如果你需要额外的支持文件,你有两个select。 将它们全部保留在根目录中,或将专用支持文件放在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
想法 – 将公共和私有接口分开。
这样做会给你一个很好的导入path, myproj.org/mypack
重用其他项目中的代码。 如果你使用lib
那么内部支持文件将会有一个导入pathmyproj.org/lib/mysupport
。
在构build项目时,使用main/mypack
,例如: go build main/mypack
。 如果你有多个可执行文件,你也可以将它们分开,而不必创build单独的项目。 例如main/myfoo/myfoo.go
和main/mybar/mybar.go
。
我觉得非常有用,了解如何在Golang中组织代码,这一章由Caleb Doxsey所着的这本书http://www.golang-book.com/11
似乎没有组织Go项目的标准方式,但https://golang.org/doc/code.html指定了大多数项目的最佳实践。; jdi的答案是好的,但是如果你使用github或bitbucket,并且你还有其他的库,你应该创build下面的结构:
~/projects/ bin/ pkg/ src/ github.com/ username/ mypack/ foo.go bar.go mypack_test.go mylib/ utillib.go utillib_test.go
通过这样做,你可以有一个单独的mylib存储库,可以用于其他项目,可以通过“去”获取。 您的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