在Golang中,如何导入本地修改但不推送代码的软件包?

11

我现在正在学习Golang,是一个完全的新手。我有一个关于包的问题。

考虑以下情况:

假设我有一个名为 github.com/ilatif/A 的包,在其中我导入了另一个包github.com/ilatif/B,如下所示:

import "github.com/ilatif/B"

现在由于 github.com/ilatif/Agithub.com/ilatif/B 都是我的包,并且我正在本地工作,是否有一种方法可以从 github.com/ilatif/B 包中拉取更改而不将代码推送到 GitHub?根据 Golang 的文档,需要将代码推送到相关的 repo 中,但我想知道是否有这样一种方法,可以在没有将包推送到上游的情况下拉取我自己包的本地更改。

谢谢


5
你不需要推拉任何东西,它们只是你GOPATH中的文件。 - JimB
那为什么我的本地更改没有被更新?我的$GOPATH可能有一些问题吗?我正在使用gvm。 - Imran Latif
4
如果它们没有被更新,那么你没有编辑在你的GOPATH中的版本。最好直接使用go工具(不使用gvm)先了解它们的工作原理。如果你还没有开始,请从这里开始:如何编写Go代码 - JimB
是的,vendor/ 优先于 GOPATH。这就是为什么我建议从基础开始只使用 Go 工具,并在需要时添加其他功能。如果您需要使用供应商目录,则需要更新其中的代码,通常使用第三方工具来完成。 - JimB
感谢您解释了 vendor/ 这个事情。基本上我正在开发一个已经使用了 vendor 文件夹的应用程序。所以,只是为了澄清一下,如果之前的开发人员没有使用 vendor 的话,那么在我的本地包中更改代码就会自动反映出来?但既然之前的开发人员已经使用了 vendor 文件夹,那么我需要使用一个工具,在我更新某个包时会自动更新 vendor 文件夹中的代码。我是对的吗? - Imran Latif
显示剩余2条评论
1个回答

16

Go模块解决方案

我通过在go.mod文件中使用替换(replace)语句成功地使用了Golang模块。

https://thewebivore.com/using-replace-in-go-mod-to-point-to-your-local-module/

  • 只要您使用replace语句保存go.mod文件,Goland便会识别更新的模块。

示例

  • 使用replace MODULE_URL => /PATH/TO/MODULE/DIR语句
    • 无需指定版本号
module github.x.com/services-x/x

go 1.13

require (
    github.com/briandowns/spinner v1.8.0
    github.com/golang/protobuf v1.3.1
    github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8
    github.com/marcellodesales/cloner v0.0.0-20191126082454-c952bef1e067
    github.com/mitchellh/go-homedir v1.1.0
    github.com/mitchellh/mapstructure v1.1.2
    github.com/sirupsen/logrus v1.2.0
    github.com/spf13/cobra v0.0.5
    github.com/spf13/viper v1.4.0
    github.com/thoas/go-funk v0.4.0
    gopkg.in/src-d/go-git.v4 v4.13.1
    gopkg.in/yaml.v2 v2.2.2
)

replace github.com/marcellodesales/cloner => /Users/mdesales/dev/github.com/marcellodesales/cloner

是的,我正在使用相同的解决方案,但遇到了让 VS Code 识别这些更改的问题。我相信 Go 语言服务器(gopls)在某个地方保存了一些缓存。 - HNL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接