Git 为团队构建Go子包

Git 为团队构建Go子包,git,go,workflow,Git,Go,Workflow,我们目前正在移动一些代码库,并且正在为团队中多个开发人员的灵活目录结构而努力。如果这是一个noob问题,我表示歉意,但我已经在其他地方搜索过了,没有找到答案 假设我有一个具有以下结构的包: package main import "username/myproject/subpackage" func main() { } 和一个分包: package subpackage func main() { } 这很好,从阅读Github上的其他人代码来看,这似乎是定义子包的公认方式 以

我们目前正在移动一些代码库,并且正在为团队中多个开发人员的灵活目录结构而努力。如果这是一个noob问题,我表示歉意,但我已经在其他地方搜索过了,没有找到答案

假设我有一个具有以下结构的包:

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
    ,并且您始终在整个项目中保持这一点

  • 是的,这应该是中央回购协议,参与者(内部员工或社区)应该创建对该回购协议的请求,而不是实际处理该请求

  • 是的,他们应该在原始文件夹中使用它,并使用git remote forked(参见下文)

  • 不,是的。您可以为不可获取的包定义相对导入。也就是说,当您不在gopath中时,您可以
    导入“/subpackage”
    。但是,如果您转到GOPATH,go会抱怨您混合了本地和远程导入。在一般情况下,不要使用相对导入

  • 子包的分叉通过分叉主包来处理

  • 长版本: 我将以一个包含多个团队成员的Github回购协议为例

    中央回购将是

    该回购协议有子回购协议,如github.com/central/repo/pkg、github.com/central/repo/where

    最简单的方法和最好的方法是使用GitRemote

    假设我想为次级回购(或其他任何形式的回购)做出贡献,过程很简单:就像在其他语言中一样,分叉回购

    现在,正如您所提到的,您已经有了一个针对中心存储库的带有import的存储库副本。事实上,这并不太实际。 这就是为什么(除了简单的小项目),我从来没有
    去获取我的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
    用户名母版