在 Go 中修改导入的库

Modifying an imported library in Go

我的问题

Elastic Beats 是一个用 Go 编写的用于日志传送器的开源项目。它具有多个日志输出,包括控制台、Elasticsearch 和 Redis。我想将自己的输出添加到 AWS Kinesis。

我已将存储库克隆到 ~/github/beats,并尝试构建它:

$ cd filebeat; go build main.go

但是,由于缺少库而失败,它是项目的一部分

main.go:6:2: cannot find package "github.com/elastic/beats/filebeat/cmd" in any of:
    /usr/local/go/src/github.com/elastic/beats/filebeat/cmd (from $GOROOT)
    /Users/adam/go/src/github.com/elastic/beats/filebeat/cmd (from $GOPATH)

该项目的一个目录依赖于同一存储库中的一个包,但它不是在层次结构中向上查找一个目录,而是在 GOPATH.

中查找

所以,go get github.com/elastic/beats/filebeat/cmd 获取了代码,现在 go build main.go 可以工作了。更改我的 GOPATH 中的代码反映在这些构建中。

这给我留下了结构上的不便。我的部分代码在工作目录中,部分代码在我的 GOPATH 中并包含在我的工作目录中的代码中。

出于各种原因,我希望将所有代码放在一个目录中,最重要的是将所有内容都置于版本控制之下。

我尝试了什么

主要是在寻找问题。我是 Go 的新手,所以我可能错过了正确的术语。

我的问题

在 Go 中编辑导入库的代码的正确方法是什么?

项目工作副本应签出到 $GOPATH/src/package/import/path - 例如,该项目应签出到 /Users/adam/go/src/github.com/elastic/beats。项目位置正确后,go tooling 就可以正常运行了;否则,它将无法正确解析导入。有关详细信息,请参阅 go help gopath

使用其他包的推荐方法之一是:

  1. 获取原包源:

    go get github.com/elastic/beats
    

    因此,您会将项目的 git 存储库克隆到文件夹

    $GOPATH/src/github.com/elastic/beats
    
  2. 做一些修复,编译代码,修复,编译...当你做 go install 包将被编译并安装到你的系统。当您需要从原始存储库合并更新时,您可以 git pull 它们。

一切正常。下一步是什么?如何与他人分享您的作品?

  1. 在 github 上分叉项目,假设它将是 github.com/username/beats

  2. 将此分支作为另一个远程 mycopy(或您喜欢的任何其他名称)添加到您的本地存储库

    git remote add mycopy git://github.com/username/beats.git
    
  3. 完成所有操作后,您可以将更新的源推送到 github

    上的存储库
    git push mycopy
    

    然后打开对原始资源的拉取请求。这样您就可以与他人分享您的工作。并让您的更改与主流同步。

在开发使用 Go Modules.

的项目时,此问题的先前答案已过时

对于使用 Go Modules 的项目,可以使用以下命令将导入的库(例如 example.com/imported/module)替换为本地模块(例如 ./local/module) ):

go mod edit -replace=example.com/imported/module=./local/module

或者将以下行添加到 go.mod 文件中:

replace example.com/imported/module => ./local/module

参考文档:https://golang.org/doc/modules/managing-dependencies#unpublished