Go,go get,go install,本地包和版本控制

时间:2012-04-12 19:23:25

标签: git package go

我无法理解创建包含本地软件包的go项目的工作流程。

假设我创建了一个新项目,使用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() {
}

使用 go build go run ,本地一切正常。但这是托管在github上的,我希望能够让其他人使用 go get 命令来安装它。因此必须更改本地包导入以使用格式“github.com/user/project/utils”,这样可行,除了现在我有两个源代码副本,真正的问题是带有git历史的副本有一个导入,使用下载的副本。因此,如果我正在处理带有git历史记录的副本,那么对tools.go所做的任何更改都将被忽视,因为它将使用下载的副本。

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

5 个答案:

答案 0 :(得分:86)

我刚刚写了一篇关于如何使用新go toolgithub.com的简短分步指南。您可能会发现它很有用:

<强> 1。设置您的GOPATH

您可以将环境变量GOPATH设置为您喜欢的任何目录。如果您有更大的项目,那么为每个项目创建不同的GOPATH可能是个好主意。我建议这种方法特别是对于部署,因此更新项目A的库不会破坏项目B,这可能需要同一个库的早期版本。

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

但除非你同时在很多不同的Go项目上工作,否则它可能足以在本地只有一个GOPATH。所以,让我们创建一个:

mkdir $HOME/gopath

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

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

<强> 2。创建一个新项目

如果您想创建一个应在github.com之后托管的新Go项目,则应在$GOPATH/src/github.com/myname/myproject下创建此项目。路径与github.com repo的URL匹配很重要,因为go工具将遵循相同的约定。那么,让我们创建项目根并在那里初始化一个新的git存储库:

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

因为我不想输入这么长的路径,所以我通常会为我目前在我的主文件夹中处理的项目创建符号链接:

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

第3。编写您的申请

开始编码,不要忘记git addgit commit您的文件。另外,不要对子包使用import "./utils"之类的相对导入。它们目前没有文档,根本不应该使用,因为它们不能与go工具一起使用。请使用github.com/myname/myproject/utils之类的导入。

<强> 4。发布您的项目

创建new repository at github.com,如果您之前没有这样做,请上传您的SSH公钥并将更改推送到远程存储库:

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

<强> 5。继续处理您的项目

如果您已在.bashrc中设置了GOPATH,并且您已在主文件夹中为项目创建了符号链接,则只需键入cd myproject/并在其中编辑一些文件即可。之后,您可以使用git commit -a提交更改,并通过git push将其发送到github.com

答案 1 :(得分:10)

您可能不需要两份来源的副本。在How to Write Go Code之后,您应该有一个路径来进行Go开发,让我们说“godev”,然后在那个“src”目录下,在那之下,你的“github.com/user/project”和“github.com/user/project/utils”。 (我同意,这似乎有点僵硬,但向我们解释的优势是免于制作文件。)放弃我的项目,这是你将完成工作的地方。

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

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

不要担心go get或任何go命令会覆盖您的文件或弄乱版本控制。通过GOPATH,他们可以看到你在哪里工作,他们知道版本控制是如何工作的。

答案 2 :(得分:6)

如果您想将代码保存在本地版本存储库中,只需将代码放入GOPATH。

GOPATH接受多条路径。 例如。在linux上

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

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

参考:go help gopath

答案 3 :(得分:0)

很多人说应该使用绝对路径构造项目struct并导入:

import "github.com/user/utils"

但是这可能将您的项目限制在单个回购(github)中。我想用 相对路径:

  import "./utils"

我找不到方法,在这里提出一个问题: how to oraganize GO project packages if it will hosted on different repos(github & sourceForge)

答案 4 :(得分:0)

在不同的帖子和Go文档中寻找答案后,在Go 1.11中,发布了一种处理软件包的新方法,并且正在使用Go模块。

阅读有关Go模块here的整个系列文章。

Go Modules还负责版本控制