在 Go 中修改导入的库

Ada*_*tan 7 go libraries

我的问题

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

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

$ cd filebeat; go build main.go
Run Code Online (Sandbox Code Playgroud)

但是,由于缺少作为项目一部分的库,它失败了:

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)
Run Code Online (Sandbox Code Playgroud)

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

因此,go get github.com/elastic/beats/filebeat/cmd获取了代码,现在go build main.go可以使用了。更改 my 中的代码GOPATH反映在这些构建中。

这给我带来了结构上的不便。我的一些代码位于工作目录中,其中一些位于我的GOPATH工作目录中并包含在我的工作目录中。

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

我尝试过什么

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

我的问题

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

Tom*_*sen 5

在开发使用Go Modules 的项目时,此问题的先前答案已过时。

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

go mod edit -replace=example.com/imported/module=./local/module
Run Code Online (Sandbox Code Playgroud)

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

replace example.com/imported/module => ./local/module
Run Code Online (Sandbox Code Playgroud)

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


Adr*_*ian 2

项目工作副本应检出到$GOPATH/src/package/import/path- 例如,该项目应检出到/Users/adam/go/src/github.com/elastic/beats. 当项目处于正确的位置后,go工具就可以正常对其进行操作了;否则,它将无法正确解析导入。请参阅go help gopath获取更多信息。