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

时间:2016-06-01 19:44:59

标签: go

我的组织使用Rails开发其应用程序,但我试图在Golang中重写我们的一个后端进程,因为它更快。

我已经将我的应用程序与我们的公司构建为我的应用程序的命名空间(example.co),以及我的应用程序中每个软件包的子文件夹。

我所包含的每个图书馆(例如sqlx等)也拥有自己的文件夹。

src/
  github.com/
    jmoiron/
      (sqlx package files)
  example.co
    my_app/
      (my app package files)
    model/
      (model package files...)

However looking at other packages like sqlx,它们似乎完全废弃了这个目录结构,并将所有文件放在根目录中

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

2 个答案:

答案 0 :(得分:4)

我在第一个项目上也这样做了。我后来才知道:

  • $GOPATH/bin/ pkg/ src/布局由go get和类似命令构建
  • 您可以将.go文件整理为单个平面项目目录或子文件夹(警告:同一文件夹中的所有.go文件必须具有相同的包名称)
  • 将其他人的代码放在项目根目录下的/vendor目录中,如果它是您的应用需要运行的代码(google this,这是go imo中最糟糕的部分)
  • 将您自己的项目置于您的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
)

答案 1 :(得分:3)

我建议从一个看似合乎逻辑的布局开始,然后在应用程序增长和发展时根据需要重构/重构。

使用公司名称空间是合理的 - 我会考虑在其下面为您的应用程序创建一个目录(例如company.co/my_app),并在其中创建库程序包的子目录(例如,company.co/my_app/db等。 )以及cmd包含您要生成的实际可执行文件(package main程序)的目录的文件:cmd / exe1,cmd / exe2等。这将允许您拥有多个可执行文件以及多个图书馆"子包" my_app内部,可以与相应的导入路径独立包含。

  

我所包含的每个图书馆(例如sqlx等)也都拥有自己的文件夹。

如果你可以使用Github的最新版本的依赖项,你就不必包含依赖项'将代码安装到您的存储库中,而是将它们与go get一起安装到构建区域中。如果要从本地副本构建 - 对于企业用途,可能更适合稳定性和审计跟踪 - 您应将它们放在vendor子目录中,例如company.co/my_app/vendor/github.com/jmoiron/sqlx。通过这种方式,您可以控制何时升级到较新版本的依赖项,并确保上游更改不会破坏您的构建或在您不知情的情况下影响您的程序,直到您有机会进行全面测试。