我的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?
提前致谢。
答案 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源 文件及其关联的包对象和命令可执行文件。