应用程序与包中的Golang项目结构

应用程序与包中的Golang项目结构,go,Go,我的组织使用Rails开发其应用程序,但我正试图在Golang中重新编写我们的一个后端流程,因为它要快得多 我已经为我的应用程序(example.co)构建了一个名称空间,并为我的应用程序中的每个包构建了一个子文件夹 我包含的每个库(例如sqlx等)也有自己的文件夹 src/ github.com/ jmoiron/ (sqlx package files) example.co my_app/ (my app package files)

我的组织使用Rails开发其应用程序,但我正试图在Golang中重新编写我们的一个后端流程,因为它要快得多

我已经为我的应用程序(
example.co
)构建了一个名称空间,并为我的应用程序中的每个包构建了一个子文件夹

我包含的每个库(例如
sqlx
等)也有自己的文件夹

src/
  github.com/
    jmoiron/
      (sqlx package files)
  example.co
    my_app/
      (my app package files)
    model/
      (model package files...)
,看起来他们完全放弃了这个目录结构,并将所有文件放在根目录中


这是因为我正在编写一个应用程序,而sqlx是一个包含在其他应用程序中的包吗?或者这只是偏好的不同,因为没有真正被接受的“标准”

我在第一个项目中也这么做了。我从中学到:

  • $GOPATH/bin/pkg/src/
    布局由
    go-get
    和类似命令构成
  • 您可以将.go文件组织为单个平面项目目录或子文件夹(注意:同一文件夹中的所有.go文件必须具有相同的包名)
  • 如果你的应用程序需要使用的是代码,请将其他人的代码放在项目根目录下的
    /vendor
    目录中(google this,这是go imo最糟糕的部分)
  • 将您自己的项目放在您的gopath下,如果您希望它更容易访问,请将其符号链接到gopath
所以我可以想象你的代码看起来像:

/Users/user2490003/MyGoPath/
▾ src/github.com/user2490003/myproject/
  ▾ model/
      user.go
  ▾ myapp/
      myapp.go
  ▾ vendor/github.com/jmoiron/sqlx/
      sqlx.go
    main.go
导入完整的包引用,如下所示:

// main.go
package main
import (
  github.com/jmoiron/sqlx
  github.com/user2490003/myproject/myapp
  github.com/user2490003/myproject/model
)

我建议您从一个看起来合乎逻辑且目前有效的布局开始,然后在应用程序增长和发展时根据需要进行重构/重构

使用您的公司名称空间是合理的-我会考虑为它下面的应用程序创建一个目录(如<代码>公司.CO/MyIAPAp/代码>),并在里面为库包的子目录(例如,代码>公司。CO/MYYAPAP/DB < /代码>等)以及

cmd
一个包含您想要生成的实际可执行文件(
package main
程序)的目录:cmd/exe1、cmd/exe2等。这将允许您拥有多个可执行文件以及多个库“子包”
my_app
的内部,可与相应的导入路径一起独立包含

我包含的每个库(例如sqlx等)也有自己的文件夹


如果您可以使用Github提供的最新版本的依赖项,则不必将依赖项的代码包含到存储库中,而是使用
go get
将其安装到构建区域中。如果您想从本地副本进行构建—对于公司使用,稳定性和审计跟踪可能更可取—您应该将它们放在
vendor
子目录中,例如
company.co/my_app/vendor/github.com/jmoiron/sqlx
。这样,您可以控制何时升级到较新版本的依赖项,并确保上游更改不会破坏您的构建或在您不知情的情况下影响您的程序,直到您有机会进行彻底的测试

如果您还没有这样做,请阅读。sqlx包设计为使用“go-get”安装。从GOPATH中的根目录到
sqlx
目录的目录结构由
go-get
创建。我建议您配置Go工作区(通过设置GOPATH),运行
Go-get-github.com/jmoiron/sqlx
,并查看生成的目录结构。感谢您的详细解释。我想比较一下像我现在使用的目录结构和平面目录结构是否更好,这取决于你正在开发的应用程序的类型?@user2490003我个人喜欢文件夹,尽管平面结构意味着你永远不会迷路。记住,不同的包需要不同的文件夹。我不能说两者都“更好”