去,去得到,去安装,本地包和版本控制

我无法理解创build具有本地软件包的go项目的工作stream程。

说我创build一个新的项目,使用git进行版本控制,它有一个main.go文件和一个tools.go文件,它将在程序包utils中。 所以我有这样的目录结构:

/myproject/ main.go utils/ tools.go 

main.go如下所示:

 package main import "./utils" func main() { utils.DoSomthing() } 

和tools.go看起来像这样:

 package utils; func DoSomething() { } 

一切工作在当地很好,使用去build立运行 。 但是这是在github上托pipe,我希望能够让其他人使用go get命令来安装它。 因此,必须将本地软件包导入更改为使用格式“github.com/user/project/utils”,它的工作,除了现在我有两个源代码的副本,真正的问题是,具有git历史的副本有一个导入使用下载的副本。 因此,如果我正在使用git历史logging复制副本,则对tools.go所做的任何更改都将被忽略,因为它将使用下载的副本。

所以我想知道是否有人可以解释在同一个项目中使用go get ,版本控制和包导入的正确方法。

我刚刚写了一个关于如何使用新的go工具和github.com的简短指南 。 您可能会觉得它很有用:

1.设置你的GOPATH

您可以将环境variablesGOPATH设置为您喜欢的任何目录。 如果你有更大的项目,为每个项目创build一个不同的GOPATH可能是一个好主意。 我会推荐这种方法,特别是对于部署,所以更新项目A的库不会破坏项目B,这可能需要更早版本的同一个库。

另请注意,您可以将GOPATH设置为以冒号分隔的目录列表。 所以你可能有一个包含所有常用软件包的GOPATH,并且为每个项目使用附加软件包或不同版本的现有软件包分开GOPATHS。

但是,除非您正在同时处理许多不同的Go项目,否则它可能足以在本地只有一个GOPATH。 所以,我们来创build一个:

 mkdir $HOME/gopath 

然后你需要设置两个环境variables来告诉go工具在哪里可以find现有的Go软件包,以及它应该在哪里安装新的软件包。 最好将以下两行添加到~/.bashrc~/.profile (不要忘记之后重新加载.bashrc文件)。

 export GOPATH="$HOME/gopath" export PATH="$GOPATH/bin:$PATH" 

2.创build一个新的项目

如果你想创build一个新的Go项目,那么应该在github.com上托pipe,你应该在$GOPATH/src/github.com/myname/myproject下创build这个项目。 path与github.com仓库的URL匹配很重要,因为转入工具将遵循相同的约定。 所以,我们来创build一个项目根目录,并在那里初始化一个新的git仓库:

 mkdir -p $GOPATH/src/github.com/myname/myproject cd $GOPATH/src/github.com/myname/myproject git init 

因为我不喜欢input这样长的path,所以我通常为我目前在我的home文件夹中工作的项目创build符号链接:

 ln -s $GOPATH/src/github.com/myname/myproject ~/myproject 

3.编写你的应用程序

开始编码,不要忘记git addgit commit您的文件。 另外,不要使用相对导入,如import "./utils"作为子包。 他们目前没有文件,根本不应该使用,因为他们不会使用的工具。 改用github.com/myname/myproject/utils类的github.com/myname/myproject/utils

4.发布您的项目

在github.com上创build一个新的仓库,如果你之前没有这样做,就上传你的SSH公钥,然后把你的修改推送到远程仓库:

 git remote add origin git@github.com:myname/myproject.git git push origin master 

5.继续处理你的项目

如果你已经在你的.bashrc中设置了GOPATH,并且你已经在你的home文件夹中为你的项目创build了一个符号链接,那么你可以直接键入cd myproject/并在那里编辑一些文件。 之后,您可以使用git commit -a提交更改,并通过执行git push将它们发送到github.com 。

你可能不需要源的两个副本。 遵循如何编写Go Code ,你应该有一个Go开发的path,可以说是“godev”,在那之下是一个“src”目录,在那之下,你的“github.com/user/project”和“github.com/user/project/utils”。 (我同意,这看起来有点僵化,但是向我们解释的优点是免费制作文件。)放弃项目,这是你将要做的工作。

您至less将GOPATH设置为godev,但您可能希望您的GOPATH以不属于您的外部程序包的path开始。 例如,我使用的GOPATH是<my place on the file system>/goext:<my place on the file system>/godev

你说得对,你在main.go中的导入现在应该是“github.com/user/project/utils”。

不要担心去获取或任何go命令覆盖您的文件或搞乱版本控制。 通过GOPATH,他们看到你在哪里工作,他们知道版本控制如何工作。

如果你想保持你的代码在本地版本库,只需把你的代码放在GOPATH中。

GOPATH接受多path。 例如。 在Linux上

 GOPATH=$HOME/go:$HOME/prj/foo 

所以,你可以去安装$ HOME / go / src / …中的第三方软件包,并且可以将你的代码控制在$ HOME / prj / foo / src中。

参考: go help gopath