我对Golang目录结构有些困惑。

基于一本名为《 <走的路>》的书,应将项目代码放在src中,并建议使用以下目录结构。

1
2
3
4
5
6
7
8
9
10
    a"?a"€a"€src/
    |  a"?a"€a"€main.go
    |  a"?a"€a"€say/
    |  |  a"?a"€a"€say.go
    |  |  a"?a"€a"€say_test.go
    a"?a"€a"€bin/
    |  a"?a"€a"€say
    a""a"€a"€pkg/
       a""a"€a"€linux_amd64/
          a""a"€a"€say.a

但是我发现github.com中的许多软件包都没有src目录。

例如:

https://github.com/facebookgo/grace

https://github.com/astaxie/beego

因此,我不知道是否需要src目录。

我有一些项目,它们具有相互依赖性。
它们在私有的GitLab存储库中进行管理。

如何组织它们?

  • 您的书可能描述的是GOPATH目录树。
  • 非常感谢,我很愚蠢
  • 可能已经晚了,但是go项目样板的另一个很好的例子是qiangxue的入门工具包-github.com/qiangxue/golang-restful-starter-kit

当我刚开始使用Go时,本·约翰逊(Ben Johnson)撰写的这篇文章已经指导了我。

从这样的东西开始通常是很好的(假设您位于项目目录中,例如$GOPATH/src/myproject

1
2
3
4
5
6
7
8
9
10
a"?a"€a"€cmd/ -- this is where you compose several packages in to main package
|  a"?a"€a"€foo -- an example would be `foo`
|  |  a"?a"€a"€main.go
a"?a"€a"€pkg/ -- this is where put your reusable packages
|  a"?a"€a"€pkg1 -- reusable package 1
|  a"?a"€a"€pkg2 -- reusable package 2
a"?a"€a"€otherpackage1
|  a"?a"€a"€ ...
a"?a"€a"€otherpackage2
|  a"?a"€a"€ ...

您可以在go-kit中查看此示例,了解这种项目结构。

有时这取决于您的需求。在我们的工作流程中,我们正在使用一个名为Fresh的热代码重载工具,因此我们需要将main.go放在项目根目录上,以便该工具可以检测到所有文件更改并重建源代码。

1
2
3
4
5
6
7
8
a"?a"€a"€app/
|  a"?a"€a"€app.go
a"?a"€a"€model/ --
|  a"?a"€a"€model.go
a"?a"€a"€store
|  a"?a"€a"€store.go
a"?a"€a"€main.go -- this is where the app starts
a"?a"€a"€...

app.go包上,我有类似func Run() error这样的东西来启动应用程序。在main.go上,我只是调用函数:

1
2
3
4
...
func main(){
    log.Fatal(app.Run())
}

现在有新的方式来组织golang项目。
进入github的golang标准,据说:

This is a basic layout for Go application projects. It represents the
most common directory structure with a number of small enhancements
along with several supporting directories common to any real world
application.

This project layout is intentionally generic and it doesn't try to
impose a specific Go package structure.

或者您可以按照以下幻灯片操作:

1
2
3
4
5
6
7
8
9
10
$GOPATH/
    src/
        github.com/user/repo/
            mypkg/
                mysrc1.go
                mysrc2.go
            cmd/mycmd/
                main.go
    bin/
        mycmd
  • 尽管回购包含一些有趣的观点,但它似乎不是golang的官方指南。换句话说,这只是对该主题的"另类"意见,因此我不会将其定位为"新方法",因为"新方法"听起来像是取代现有方法的最终指导。

这本书描述了签出后的目录结构。如果本书包含.git目录,这将是有帮助的。

$ GOPATH / src是导入工作所必需的。

1
2
3
4
5
6
7
8
9
10
11
12
    a"?a"€a"€src/
    |  a"?a"€a"€.git
    |  |  a"?a"€a"€...
    |  a"?a"€a"€main.go
    |  a"?a"€a"€say/
    |  |  a"?a"€a"€say.go
    |  |  a"?a"€a"€say_test.go
    a"?a"€a"€bin/
    |  a"?a"€a"€say
    a""a"€a"€pkg/
       a""a"€a"€linux_amd64/
          a""a"€a"€say.a

实际上,main.go实际上位于反映远程git存储库的路径中,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.  
a"?a"€a"€ bin
a"??? a""a"€a"€ say
a"?a"€a"€ pkg
a"??? a""a"€a"€ linux_amd64
a"???     a""a"€a"€ github.com
a"???      ?? a""a"€a"€ pschultz
a"???      ??     a""a"€a"€ hello-world
a"???                 a""a"€a"€ say.a
a""a"€a"€ src
 ?? a""a"€a"€ github.com
 ??     a""a"€a"€ pschultz
 ??         a""a"€a"€ hello-world
 ??             a"?a"€a"€ .git
 ??             a"?   a""a"€a"€ ...
 ??             a"?a"€a"€ main.go
 ??             a""a"€a"€ say
 ??                 a"?a"€a"€ say.go
 ??                 a""a"€a"€ say_test.go

不需要src目录,实际上许多公共存储库都不使用此结构。

组织项目有几种不同的方式。如果您打算让其他存储库(例如lib)使用您的项目。我建议使用这样的cmd结构。如果启动应用程序的方法不止一种,那么这也是推荐的方法。 (可复制的main.go文件)

1
2
3
4
5
6
a"?a"€a"€cmd/
|  a"?a"€a"€(application name)
|  |  a"?a"€a"€main.go
a""a"€a"€say/
   a"?a"€a"€say.go
   a""a"€a"€say_test.go

否则,例如,如果它是一个独立的应用程序。您可以将main.go放置在存储库的根目录中。

bin和pkg可以保留在根目录中,并将其添加到.gitignore中。 (假设您正在使用git)

  • bin和pkg应该位于GOPATH的根目录中,它们根本不应该位于项目目录中,就像src一样。
  • github上的golang标准golang-standards/project-layoutsrc目录上是一致的。