我很难理解创建包含本地包的go项目的工作流程.

假设我创建了一个新项目,使用git进行版本控制,它有一个main.go文件和一个tools.go文件,它们将位于包utils中.因此,我有一个如下所示的目录 struct :

/myproject/
   main.go
   utils/
     tools.go

main.go如下所示:

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

还有工具.go看起来像这样:

package utils;
func DoSomething() {
}

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

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

推荐答案

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

1. Setup your GOPATH

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

还要注意,您可以将GOPATH设置为由冒号分隔的目录列表.因此,您可能有一个包含所有常用包的GOPATH,并且每个项目都有单独的GOPATH,其中包含其他包或现有包的不同版本.

但是,除非你同时在很多不同的围棋项目上工作,否则在当地只有一个GOPATH可能就足够了.因此,让我们创建一个:

mkdir $HOME/gopath

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

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

2. Create a new project

如果您想要创建一个新的Go项目,该项目应该在以后的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. Write your application

开始编码,别忘了git addgit commit你的文件.此外,不要将相对导入(如import "./utils")用于子包.它们目前没有文档记录,根本不应该使用,因为它们不能与Go工具一起使用.取而代之的是使用github.com/myname/myproject/utils这样的导入.

4. Publish your project

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

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

5. Continue working on your project

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

Go相关问答推荐

如何在gocql中设置gocqlSYS标志?

如何修复在Go API中使用Gin Framework的请求资源上没有使用Gin Framework的请求源的消息?''

Gorm foreign 密钥

即使HTTP服务器正在使用GO和Protobuf、SQL Server启动,请求也不返回结果

在GO中使用泛型类型 struct 实现接口方法

在 go 中,将接收器 struct 从值更改为指针是否向后兼容?

Go 中如何判断 struct 体是否包含另一个 struct 体?

该文件位于模块.内,该模块不包含在您的工作区中

Golang:如何在不转义每个动作的情况下呈现模板的模板?

如何在 gocql 中设置最大池大小?

如何在模板中传递和访问 struct 片段和 struct

为什么互斥量比 golang 中的通道慢?

有没有什么方法可以在不使用 if/else 的情况下在 Golang 中处理 nil 指针?

panic :拨号 tcp:在 172.22.64.1:53 上查找 bookstoreDB:没有这样的主机

关系不存在 GORM

K8s 算子读取原始数据

Go 使用 struct 作为接口而不实现所有方法

如何正确判断 io.Reader 是否为零?

Go 泛型是否与 LINQ to Objects 等效?

Golang 查询扫描未将查询正确扫描到 struct 中