繁体   English   中英

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

[英]Go, go get, go install, local packages, and version control

我无法理解创建具有本地包的 go 项目的工作流程。

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

/myproject/
   main.go
   utils/
     tools.go

main.go 看起来像这样:

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

和 tools.go 看起来像这样:

package utils;
func DoSomething() {
}

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

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

我刚刚写了一个简短的分步指南,介绍我如何使用新的go 工具github.com 您可能会发现它很有用:

1. 设置你的 GOPATH

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

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

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

mkdir $HOME/gopath

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

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

2.新建项目

如果你想创建一个新的 Go 项目,稍后应该在github.com上托管,你应该在$GOPATH/src/github.com/myname/myproject下创建这个项目。 路径与 github.com 存储库的 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"这样的相对import "./utils" 它们目前没有记录,根本不应该使用,因为它们不能与 go 工具一起使用。 改用像github.com/myname/myproject/utils这样的github.com/myname/myproject/utils

4. 发布你的项目

在 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

您可能不想要源的两个副本。 遵循How to Write Go Code ,您应该有一个进行 Go 开发的路径,比如说“godev”,在该路径下,有一个“src”目录,在该目录下,您的“github.com/user/project”和“github.com/user/project/utils”。 (我同意,这似乎有点僵硬,但向我们解释的优点是免于生成文件。)放弃 myproject,这是您工作的地方。

您至少将 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,他们可以看到您正在工作的地方,并且他们知道版本控制是如何工作的。

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

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

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

因此,您可以在 $HOME/go/src/... 中安装 3rd 方软件包,并且可以在 $HOME/prj/foo/src 中控制您的代码。

参考: go help gopath

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

此处阅读有关 Go Modules 的整个系列文章。

Go Modules 还负责版本控制

很多人说应该使用绝对路径来构建项目结构和导入:

import "github.com/user/utils"

但这可能会将您的项目限制在单个 repo (github) 内。 我想改用相对路径:

  import "./utils"

我还没有找到办法做到这一点,我在这里提出一个问题: 如果 GO 项目包将托管在不同的存储库(github 和 sourceForge)上,如何组织它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM