组织一个多文件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.gomypack.gopackage mypackmain/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.gomain/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