使用Git(或任何VCS)的Go项目的正确组织是什么?

时间:2012-06-03 09:34:00

标签: git go

我的GOPATH是/Users/joe/go。我正在开发一个名为myproj的项目,该项目名为myproj

如果我想能够编写import "myproj",那么我需要的目录结构是:

$GOPATH/src/myproj/myproj.go
$GOPATH/src/myproj/myproj_test.go
...

然而,我似乎无法与Git合作。如果我查看example package from Google,我会看到以下格式:

go.example/hello/hello.go
go.example/LICENSE

其中go.example是回购的名称。

因此,实际的包目录在里面存储库中找到。如果我把这个存储库的内容放在我的$ GOPATH的目录中,例如

$GOPATH/src/go.example/hello/hello.go
$GOPATH/src/go.example/LICENSE

然后我必须输入import "go.example/hello"而不是import "hello"

回到我的项目,我需要将它打包到Git存储库中,然后我需要一个容器目录。所以我目前的文件结构是:

$GOPATH/src/myproj                        # The dir for the git repo
$GOPATH/src/myproj/.git
$GOPATH/src/myproj/LICENSE                # Files in the base of the repo
$GOPATH/src/myproj/myproj/myproj.go       # Package files in package dir
$GOPATH/src/myproj/myproj/myproj_test.go  

我需要外部myproj目录来绑定git存储库,我需要将内部目录作为包目录。结果是我需要输入import "myproj/myproj"而不是import "myproj"

我该如何解决这个问题?我是否必须为我正在开发的每个项目添加多个$ GOPATHS?

提前致谢。

3 个答案:

答案 0 :(得分:8)

首先关闭:

  

我是否必须为我正在开发的每个项目添加多个$GOPATH

不,您根本不需要多个$GOPATH

它们是管理您(可能是几个)项目的工具。当您设置一个新的项目环境时,您已经知道它将具有某些依赖项 - 可能对该项目是唯一的,或者应该与其他人设置类似,您可以创建一个新的项目文件夹并将其设置为GOPATH。这样,您还可以为该项目使用(=签出)特定版本的库,而在其他项目文件夹(= GOPATH s)中使用其他项目的其他版本。

至于您的路径问题:Go遵循author/project(或organization/project)的通用范例。当几个人,作者和组织启动具有相同名称的项目时,这将防止命名冲突。 (然后作者可以在“他的”文件夹中使用子文件夹,子项目以及。)

如果你知道这一点并且仍然只想使用myproj作为你的包路径,在该文件夹中创建git存储库没有问题 - 与您链接的示例包相反。

  

回到我的项目,我需要将它打包到Git存储库中,然后我需要一个容器目录。

是什么让你这么想? Go不需要它。 Git没有。

以下内容将起作用:

/src/myproj/.git
/src/myproj/myproj.go

虽然不是鼓励的做法,您可以将存储库放入myproj文件夹


我测试了如下:

FOLDER
FOLDER/src
FOLDER/src/myproj
FOLDER/src/myproj/myproj.go
FOLDER/src/mainproj
FOLDER/src/mainproj/main.go

使用folder/src/myproj/myproj.go

package myproj

type My struct {
    I int
}

folder/src/mainproj/main.go

package main

import (
    "fmt"
    "myproj"
)

func main() {
    my := myproj.My{7}
    fmt.Printf("Works! %v", my.I)
}

运行

cd FOLDER
set GOPATH=FOLDER
go run src/mainproj/main.go

将输出:

Works! 7

现在,如果git init位于FOLDER/src/myproj文件夹中,则根本不需要Go。

答案 1 :(得分:2)

通常的设置如下:

$ GOPATH,在第一次近似中只需要一条路径,你的例子/Users/joe/go/就好了。现在您在myproj看到了一个github存储库http://github.com/joe/myproj。此包的import语句应为

import "github.com/joe/myproj"

回顾你的(单值)$ GOPATH,go工具将在$GOPATH/src/github.com/joe/myproj查找你的包,这是你的“外部”github存储库的“本地”根,文件为myproj.go等。去吧......里面。

如果没有这些约定,杰克(以及爱丽丝和鲍勃)项目的名称空间冲突也会被意外调用myproj,所以我建议从一开始就习惯这个。

答案 2 :(得分:0)

您自然会导入多个包:

  • 标准的
  • 您将使用go get
  • 下载一些内容
  • 项目中的一些
  • 其他项目中的一些

最简单的方法是选择一个目录,go get所有外部包(例如mysql驱动程序),并将项目目录添加到GOPATH。

例如,这是我的(简化)GOPATH:

export GOPATH=/home/dys/dev/go:/home/dys/dev/Chrall/go:/home/dys/dev/braldop/go:/home/dys/dev/lg/go

我将go get中使用/home/dys/dev/go获得的所有外部库放在/home/dys/dev/lg/go/src/pkg1/xxx.go /home/dys/dev/lg/go/src/pkg2/xxx.go /home/dys/dev/lg/go/src/prog1/xxx.go 中,而Chrall,braldop和lg是我的3个项目。

在这3个项目的每个项目中,我都有包和命令。例如:

import (
"database/sql"
_ "github.com/ziutek/mymysql/godrv"
)

所有包裹都是通过GOPATH找到的。

例如,当我使用驱动程序mysql时,在其中一个xxx.go:

go get github.com/ziutek/mymysql/godrv

驱动程序已安装在/ home / dys / dev / go中使用

{{1}}

参考: http://golang.org/doc/code.html

  

GOPATH = / home / user / ext:/ home / user / mygo

     

(在Windows系统上使用   分号作为路径分隔符而不是冒号。)

     

列表中的每个路径(在本例中为/ home / user / ext或/ home / user / mygo)   指定工作空间的位置。工作空间包含Go源   文件及其关联的包对象和命令可执行文件。