去,去得到,去安装,本地包和版本控制
我无法理解创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 add
和git 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