11

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

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

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

但是,我似乎无法使其适合 Git。如果我查看来自 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?

提前致谢。

4

3 回答 3

8

首先:

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

不,你根本不需要多个$GOPATHs 。

它们是管理您(可能是多个)项目的工具。当您设置一个新的项目环境时,您已经知道它会有一些依赖项——可能是该项目独有的,或者应该与其他人的设置类似,您创建一个新的项目文件夹并将其设置为GOPATH. 这样,您还可以为该项目使用(=检出)特定版本的库,同时为其他项目文件夹(= GOPATHs)中的其他项目使用其他版本。

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

如果您知道这一点并且仍然只想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 本身就无关紧要了。

于 2012-06-03T16:18:37.210 回答
2

通常的设置是这样的:

$GOPATH,第一个近似值只需要一个路径,您的示例/Users/joe/go/就可以了。现在您有一个 github 存储库myproj,位于http://github.com/joe/myproj. 这个包的导入语句应该是

import "github.com/joe/myproj"

回顾您的(单值)$GOPATH,go 工具将在$GOPATH/src/github.com/joe/myproj您的“外部”github 存储库的“本地”根目录中查找您的包,其中包含 myproj.go、etc.go、... 文件。

如果没有这些约定,Jack(以及 Alice 和 Bob 的)项目会发生命名空间冲突,不小心调用了 also myproj,所以我建议从一开始就习惯这一点。

于 2012-06-03T10:12:39.537 回答
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我把使用in/home/dys/dev/go和 Chrall、braldop 和 lg获得的所有外部库都放在了我的 3 个项目中。

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

/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

等等

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

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

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

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

go get github.com/ziutek/mymysql/godrv

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

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

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

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

于 2012-06-03T10:19:30.413 回答