大型项目的包层次结构

时间:2014-05-09 08:21:04

标签: go

我想参与一个大型项目。为了共同的编程范例,我想将我的项目分成包。一个例子如下:

project/
    domain/
    utils/
    system/

Go包装系统似乎不适合这种包装。假设每个包都是独立包。但是在处理大型项目时,人们可能不得不以某种方式相互依赖使用包。构建这样的层次结构有几个原因:

  • 松散耦合的代码
  • 代码库的逻辑分离
  • 在单个VCS存储库中管理整个项目

那么,这在Go中是否可行,或者我是否应该自己调整以包装GOPATH下的所有内容?在这种情况下,我必须为每个包创建一个存储库,并且可以从不相关的包中导入包,但对它们来说是无意义的机制。

1 个答案:

答案 0 :(得分:7)

Go中的每个包(除了 main )都表现得像一个库。

您应该像制作图书馆一样编写包。它看起来是非常简单和有效的方法 - 它遵循主要的Go原则。图书馆应该了解自己的一切。

  

但是在处理大型项目时,可能不得不以某种方式相互依赖使用包。

这看起来像是一个问题点。为什么您希望拥有两个依赖于自己的软件包(ab)(a需要bb需要a) - 它违反了Go原则之一(循环依赖)。如果您无论如何考虑这种用法,那么您应该合并这些包。

如果您仍然不确定如何撰写软件包 - 请查看 Go 标准库。好的例子可能来自http package

在我们的项目中,我们希望将应用程序类型(模型)分离到单独的包中,因此我们可以在项目的其他应用程序中使用它们。您需要考虑将项目的哪个部分用作应用程序,以及作为库/驱动程序。

  

松散耦合的代码

实际上,同一个包(目录)中的文件编号没有限制 [update] 包是同一目录中的一堆文件。包/目录可以嵌套。

  

在单个VSC存储库中管理整个项目

没有什么可以阻止您将项目中的所有库保留在单个存储库中。 Go std包(有几十个)都在一个存储库中。

[update] 此外,您还需要了解软件包之间的区别以及 go get 如何解析/获取它们。 go get是一个工具,用于解释import个路径,并使用支持的前缀处理这些路径(例如:github,bitbucket .... - 您可以阅读关于他们去go get docs)。因此,如果包以 github / user / name 开头,则使用 HTTPS 在本地克隆整个存储库。

例如,我在同一个存储库中有两个包:

  • “github.com/scale-it/go-web”
  • “github.com/scale-it/go-web/handlers”

go get了解它们并只克隆一次(在 $ GOPATH / src 目录下)