Git 为团队构建Go子包
我们目前正在移动一些代码库,并且正在为团队中多个开发人员的灵活目录结构而努力。如果这是一个noob问题,我表示歉意,但我已经在其他地方搜索过了,没有找到答案 假设我有一个具有以下结构的包:Git 为团队构建Go子包,git,go,workflow,Git,Go,Workflow,我们目前正在移动一些代码库,并且正在为团队中多个开发人员的灵活目录结构而努力。如果这是一个noob问题,我表示歉意,但我已经在其他地方搜索过了,没有找到答案 假设我有一个具有以下结构的包: package main import "username/myproject/subpackage" func main() { } 和一个分包: package subpackage func main() { } 这很好,从阅读Github上的其他人代码来看,这似乎是定义子包的公认方式 以
package main
import "username/myproject/subpackage"
func main() {
}
和一个分包:
package subpackage
func main() {
}
这很好,从阅读Github上的其他人代码来看,这似乎是定义子包的公认方式
以CoreOS源代码为例:
我的问题是,由于Go的目录结构,这些包存储在特定的git repo中,如果团队中的其他人签出这些代码来处理,它们的目录结构将因分叉而不同。路径和导入语句中的用户名将更改。事实上,我们相互拉、推,而不是使用集中回购,这无助于实现这一点
package main
import "otherusername/myproject/subpackage" (This line will have to be changed)
func main() {
}
我读到的关于Go的所有内容都指向它在团队环境中的可用性,所以我想知道我是否正确地理解了包系统
理想情况下,我们希望能够使用相对路径调用子包。我们习惯于使用名称空间,我知道Go没有名称空间。即:
package main
import "myproject/subpackage"
func main() {
}
但是Go找不到文件,我确信这不是正确的方法,因为没有在线示例使用相对路径
有几个问题:
1) 包是否应该有一个已定义的所有者,并始终将该用户名作为导入路径的一部分
2) 该“所有者”回购协议是否应该是所有代码被推送到/从中提取的中心化存储库(比如公司或组织)
3) 处理一段代码的其他团队成员是否应该在creators文件夹/命名空间中使用它,而不是在他们自己的文件夹/命名空间中使用它
4) 有没有办法在导入语句中定义相对路径?如果有,为什么没有人这么做?这被认为是坏习惯吗
5) 如何使用Go子包处理回购分叉
谢谢。短版:
go-get-Package
),因此99%的时间里,您的包将是github.com/user/reponame
,并且您始终在整个项目中保持这一点
导入“/subpackage”
。但是,如果您转到GOPATH,go会抱怨您混合了本地和远程导入。在一般情况下,不要使用相对导入
去获取我的fork,我去获取中央存储库,去$GOPATH/src/github.com/central/repo
并用git remote add creack>添加我的远程设备https://github.com/creack/repo
现在我可以处理这个项目,把它当作中心项目来使用,完成后,我将分支推到分支上,然后创建一个pull请求
在这种情况下,fork只是github上源代码的占位符,没有被使用。我对go package fork也有同样的困惑。我没有通过Git与go使用团队合作,所以请恕我直言,但我的感觉是,人们往往只在自己的工作区目录中处理自己的分支,因此,它们的所有本地版本都使用相同的导入路径。如果导入路径中有一个名称,它通常是组织的名称。我注意到go也存在同样的问题。我发现有三种解析包的方法,我称之为:“按位置”、“按实现”和“按接口”。我喜欢“接口”(比如C,C++,虽然接口从这些语言中的实现细节改变了,这破坏了一切)。我认为“通过实现”也不太糟糕(正如NPM包管理器和大多数其他人所看到的)。但围棋似乎是非常“按位置”的,我认为它非常不灵活。这也意味着依赖关系管理没有将接口和实现分离的概念。我们还没有真正接触到go get。您确实澄清了其中的一些要点。感谢您提供的git-remote
解决方案:您可能只从中央回购中提取,而只推送到您的回购中,因此添加另一个远程设备的替代方法是git remote set url——推送到源https://github.com/username/repo
这样您就可以git pull
和git push
而无需指定origin master
或用户名母版