大型项目的包层次结构

mtyurt:

我想从事一个大型项目。为了通用的编程范例,我想将项目分为多个包。示例如下:

project/
    domain/
    utils/
    system/

Go包装系统似乎不适用于这种包装。假定每个程序包都是独立程序包。但是,在处理大型项目时,可能必须使用彼此依赖的软件包。建立这样的层次结构有几个原因:

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

那么,这在Go中是可能的,还是我应该使自己适应于打包以下内容GOPATH在这种情况下,我必须为每个程序包创建一个存储库,并且会有一些程序包可以从不相关的程序包中导入,但是对于它们来说是毫无意义的机制。

罗伯特·扎伦巴(Robert Zaremba):

Go中的每个包(除了main之外)的行为都像一个库。

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

但是,在处理大型项目时,可能必须使用彼此依赖的软件包。

这看起来像一个问题点。为什么您要拥有两个依赖于它们的包(ab)(arequire bbrequire a)-这违反了Go原则之一(循环依赖)。如果您考虑这种用法,则应合并这些软件包。

如果仍然不确定如何编写软件包,请查看Go标准库。http包可能是一个很好的例子

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

松耦合代码

实际上,同一包(目录)中的文件数量没有限制。
[更新]包是同一目录中的一堆文件。包/目录可以嵌套。

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

没有什么可以阻止您将项目中的所有库保留在单个存储库中。Go std软件包(有数十个)位于单个存储库中。

[更新]另外,您还需要了解软件包之间的区别以及如何获取解析/获取它们。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目录下)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章