我无法理解创建包含本地软件包的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 ,版本控制和包导入的正确方法。
答案 0 :(得分:86)
我刚刚写了一篇关于如何使用新go tool和github.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 add
和git 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)