我想参与一个大型项目。为了共同的编程范例,我想将我的项目分成包。一个例子如下:
project/
domain/
utils/
system/
Go包装系统似乎不适合这种包装。假设每个包都是独立包。但是在处理大型项目时,人们可能不得不以某种方式相互依赖使用包。构建这样的层次结构有几个原因:
那么,这在Go中是否可行,或者我是否应该自己调整以包装GOPATH
下的所有内容?在这种情况下,我必须为每个包创建一个存储库,并且可以从不相关的包中导入包,但对它们来说是无意义的机制。
答案 0 :(得分:7)
Go中的每个包(除了 main )都表现得像一个库。
您应该像制作图书馆一样编写包。它看起来是非常简单和有效的方法 - 它遵循主要的Go原则。图书馆应该了解自己的一切。
但是在处理大型项目时,可能不得不以某种方式相互依赖使用包。
这看起来像是一个问题点。为什么您希望拥有两个依赖于自己的软件包(a
和b
)(a
需要b
和b
需要a
) - 它违反了Go原则之一(循环依赖)。如果您无论如何考虑这种用法,那么您应该合并这些包。
如果您仍然不确定如何撰写软件包 - 请查看 Go 标准库。好的例子可能来自http package。
在我们的项目中,我们希望将应用程序类型(模型)分离到单独的包中,因此我们可以在项目的其他应用程序中使用它们。您需要考虑将项目的哪个部分用作应用程序,以及作为库/驱动程序。
松散耦合的代码
实际上,同一个包(目录)中的文件编号没有限制 [update] 包是同一目录中的一堆文件。包/目录可以嵌套。
在单个VSC存储库中管理整个项目
没有什么可以阻止您将项目中的所有库保留在单个存储库中。 Go std包(有几十个)都在一个存储库中。
[update] 此外,您还需要了解软件包之间的区别以及 go get 如何解析/获取它们。 go get是一个工具,用于解释import
个路径,并使用支持的前缀处理这些路径(例如:github,bitbucket .... - 您可以阅读关于他们去go get docs)。因此,如果包以 github / user / name 开头,则使用 HTTPS 在本地克隆整个存储库。
例如,我在同一个存储库中有两个包:
go get
了解它们并只克隆一次(在 $ GOPATH / src 目录下)