在 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
。
使用其他包的推荐方法之一是:
获取原包源:
go get github.com/elastic/beats
因此,您会将项目的 git 存储库克隆到文件夹
$GOPATH/src/github.com/elastic/beats
做一些修复,编译代码,修复,编译...当你做 go install
包将被编译并安装到你的系统。当您需要从原始存储库合并更新时,您可以 git pull
它们。
一切正常。下一步是什么?如何与他人分享您的作品?
在 github 上分叉项目,假设它将是 github.com/username/beats
将此分支作为另一个远程 mycopy
(或您喜欢的任何其他名称)添加到您的本地存储库
git remote add mycopy git://github.com/username/beats.git
完成所有操作后,您可以将更新的源推送到 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
我的问题
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
。
使用其他包的推荐方法之一是:
获取原包源:
go get github.com/elastic/beats
因此,您会将项目的 git 存储库克隆到文件夹
$GOPATH/src/github.com/elastic/beats
做一些修复,编译代码,修复,编译...当你做
go install
包将被编译并安装到你的系统。当您需要从原始存储库合并更新时,您可以git pull
它们。
一切正常。下一步是什么?如何与他人分享您的作品?
在 github 上分叉项目,假设它将是
github.com/username/beats
将此分支作为另一个远程
mycopy
(或您喜欢的任何其他名称)添加到您的本地存储库git remote add mycopy git://github.com/username/beats.git
完成所有操作后,您可以将更新的源推送到 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