如何用golang使用本地go模块并举例说明

416 阅读3分钟

Image result for golang modules"

在编码的时候,我喜欢把所有的东西放在文件夹里,这取决于它们的作用。我几乎总是为utils、parser等设置特定的目录。因此,这里有一个关于如何在golang中使用本地go模块的完整指南。

当我开始使用go模块时,我正在从dep迁移一个项目,该项目遵循这种架构。我有一个utils目录,另一个目录负责处理我的数据输入结构的所有解析工作。但后来我需要用到utils目录下的函数。 我被卡住了,找不到如何使目录可以在项目中的任何地方导入(就像过去的dep那样)。因为相对导入是go模块的噩梦(移除gopath毕竟是有代价的)。

因此,经过相当多的发火和在网上搜索,寻找一个优雅的,而不是像一些疯狂的相对导入的解决方案,我找到了这个解决方案,由于我费了很大劲才找到这个解决方案,我想我应该和大家分享。

示例项目

下面是我们的示例项目目录结构:

├──
go.mod
├── hello
│ ├── go.

mod │ └── hello.mod

mod
│ └── hello.go
├── main.go
├── README.md
└── utils
├── go.mod
└── multigreet.go

你也可以在我的github资源库中看到示例代码:github.com/drov0/Golan…

代码相对简单:我有两个目录,helloutils,我想从main.go文件中导入。当事情变得有点棘手时,我想在utils目录中导入hello目录。

我们要导入的hello.go文件的代码是这个超级复杂的函数。

package hello

func Hello(name string) string {
   return "hello " + name
}

addAndGreet.go文件的代码就比较复杂了。

package utils

注意我们是如何导入"example.org/hello"

最后,这是main.go文件。

package main

很明显,example.org/helloexample.org/utils 模块并不存在,所以这些导入对我们的编译器来说是毫无意义的,所以让我们帮他一下吧

#mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; width:100%;}/*在你的网站样式表或这个样式块中添加你自己的Mailchimp表单样式覆盖。 我们建议将这个块和前面的CSS链接移到你的HTML文件的头部。*/

订阅更多信息(我保证不会发送垃圾邮件)。

在main.go中导入本地模块

所以首先我们要把所有的目录转换成go模块。为此,我们需要在每个目录的根目录下添加一个go.mod。
然后在go.mod里面给它们起一个我们想要的模块名称,但要记住必须是一个网址。在我的例子中,我把这个。

module example.org/hello in the go.mod for the hello directory
module example.org/utils
in the go.mod for the utils directory

导入现在有点意义了吧?但我们还没有完成。

替换关键字

这就是奇迹发生的地方,go.mod文件有几个关键字非常有用,其中一个是replace,replace的作用是它接受一个模块路径(例如:example.org/hello)并将其替换为直接或相对路径。

以下是 replace 关键字的语法。

replace url.com/of/the/module => /direct/path/to/files

注意,替换也适用于相对路径。

主go.mod

module example.com/localmodexample

通常所有的go模块的依赖都是与版本有关的,所以要在golang中使用本地go模块,你必须设置v0.0.0

最后,在require之后,我只是告诉编译器这些urls是本地的,可以在同一个目录下找到./hello./utils 。这个主go.mod文件的好处是,现在即使是utils模块也知道在哪里可以找到hello模块,因为url已经被替换。

总结

这就是你需要知道的在golang中使用本地go模块的全部内容。希望这能为你节省我在这方面所花的时间。请记住,你可以在我的github上找到完整的代码:github.com/drov0/Golan…

我知道距离我上一篇文章已经有一段时间了,但是我很忙。但现在我应该能更经常地在这个博客上发帖了。

The postHow to use local go modules with golang with examplesappeared first onMartin Lees.