我对如何编写Go Code文章有2点困惑。它们可能是文章中的错误,或者我可能只是错过了重点。在描述典型工作空间的结构时,文章说
src 子目录通常包含多个版本控制存储库(例如 Git 或 Mercurial(,用于跟踪一个或多个源包的开发。
本文中的第一个示例工作区与此描述匹配,其中 2 个文件夹代表存储库(github.com/golang/example/
和golang.org/x/image/
(,每个文件夹在其下方都有一个 .git 目录。
后来,文章说:
如果您使用的是源代码管理系统,现在是初始化存储库、添加文件和提交第一个更改的好时机。同样,此步骤是可选的:您不需要使用源代码管理来编写 Go 代码。
然后,本文显示了在src/github.com/user/hello/
目录中运行git init
的示例代码。这是混淆点#1。由于github.com/user
是存储库,hello
是包,因此似乎应该在github.com/user
级别完成git init
。
混淆点 #2 出现在文章末尾,当它说:
发出上述 go get 命令后,工作区目录树现在应如下所示:
然后,它显示了另一个示例存储库,该存储库在github.com/golang/example/
目录下有一个.git
目录,但在github.com/user/
目录下没有该目录,无论是在其正下方还是在之前初始化它的hello
包中。
我的问题是:
- 存储库应该在
hello
目录中初始化还是在更高一级中初始化? - 最终存储库是否应该显示
.git
目录?
由于
github.com/user
是存储库,hello
是包,因此似乎应该在github.com/user
级别完成git init
。
不,不是。github.com/user
是 GitHub 用户。用户具有存储库,例如github.com/user/hello
。一个仓库可以容纳一个或多个 go 包,包括一个可能位于仓库顶层并与仓库同名的包。
您链接到的文档没有准确显示目录树 - 它们将目录名称组合在一起,这意味着相同深度的目录不一定具有相同的深度。
这不是文档的错误- 扁平化目录树以避免浪费屏幕空间是相当常见的(特别是在Java项目中,由于Java的文件/包命名约定,您将有许多目录都只包含一个子目录由编译器强制执行(。
"发出上述 go get 命令后,工作区目录树现在应如下所示:"之后的树形图
应如下所示:bin/
hello # command executable
src/
github.com/
golang/
example/
.git/ #
hello/
hello.go #
stringutil/ #
reverse.go #
reverse_test.go #
user/
hello/ # "github.com/user/hello" package repo root
hello.go #
stringutil/ # "stringutil" package source root, but not a repo
reverse.go #
reverse_test.go # test source
请注意,github.com/user
被描述为"基本路径",而不是存储库根目录或包路径,但github.com/user/hello
被描述为包根目录。
存储库应该在 hello 目录中初始化还是更高一级?
假设hello
目录是项目的根目录,并且您使用的是版本控制系统,是的。
在博客文章中,在 https://golang.org/doc/code.html#Command,是的,这个目录是hello程序/项目的根,属于命名空间github.com/user/
。因此,由于此演示使用VCS,目前git
,是的,它包含一个.git
目录。
最终存储库是否应该显示 .git 目录?
如果这是一个存储库,那么是的,它包含一个.git
或类似的目录来存储VCS的元数据。
虽然,拥有一个存储库,即由 VCS 管理的目录,对于运行 go 程序并不是强制性的。
当您想要浏览历史记录和/或保存程序的多个状态和/或编写并与其他人共享您的代码时,这是您的要求。
在企业环境中是必需的(99.999999%,肯定有一些傻瓜,我们只是人类(。