2012-04-12 114 views
52

我无法理解创建具有本地程序包的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() { 
} 

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

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

回答

81

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

1.设置您的GOPATH

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

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

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

mkdir $HOME/gopath 

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

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

2.创建一个新的项目

如果你想创建应在github.com以后主持一个新的围棋项目,你应该$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 [email protected]:myname/myproject.git 
git push origin master 

5 。继续处理你的项目

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

+3

我最近一直在接受这个问题。我开始做的只是一个GOPATH,并将我的项目融入其中。这样我可以轻松构建,但将实际项目保留在自己的回购站中。这感觉像是一个非常干净的方法。 – jdi 2012-05-05 05:53:12

+0

Github路径往往很长,我很懒,所以我给我的bashrc添加了一个别名:'alias g =“cd /home/me/goroot/src/github.com/me/”'。现在我可以通过简单的g命令快速访问我的项目。 – 2014-01-06 15:57:03

+0

你如何跟踪你的软件包使用的外部依赖关系? – mohi666 2014-11-19 01:47:35

10

你可能不想要两个源的副本。在How to Write Go Code之后,你应该有一个你开发Go的路径,可以说“godev”,在那之下有一个“src”目录,在你的“github.com/user/project”和“github.com”目录下/用户/项目/ 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。

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

+0

我有一个相关的问题,并在此之后你的指引,但我现在得到一个“进口环”的错误。我的源代码是 \ godev \ src \ github.com \ user \ project,项目导入“github.com/user/project”。 – Alec 2012-04-18 05:00:43

+1

你的项目不应该尝试导入自己。只要继续上面的示例代码,您的主程序应该导入“github.com/user/project/utils”。 – Sonia 2012-04-18 18:55:49

4

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

GOPATH接受多个路径。 例如。在Linux上

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

所以,你可以去找安装在$ HOME /去/ src目录/ ... 第三方软件包和,你可以保持在$ HOME/PRJ /富/ src目录控制你的代码。

裁判:go help gopath

+0

这个!或者索尼娅的回答。 – user7610 2017-11-21 14:00:40