登录
首页 >  Golang >  Go问答

在Go中从同一文件系统中的多个仓库导入模块

来源:stackoverflow

时间:2024-03-13 08:24:33 399浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《在Go中从同一文件系统中的多个仓库导入模块》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我有两个独立的 go 存储库。一个包含应用程序,另一个包含应用程序想要使用的共享库。两者都不在 $gopath 中。

~/projects/
├── myapplication
│   ├── go.mod
│   └── myapplication.go
└── mylibrary
    ├── go.mod
    └── mylibrary.go

mylibrary/go.mod

module example.com/mylibrary

go 1.14

mylibrary/mylibrary.go

package mylibrary

var message = "hello, world!"

myapplication/go.mod

module example.com/myapplication

go 1.14

myapplication/myapplication.go

package myapplication

import (
    "fmt"
    "example.com/mylibrary"
)

func main() {
    fmt.println(mylibrary.message)
}

我没有理由相信上面的内容应该有效,因为应用程序无法找到库在哪里。我该怎么办?

我已经尝试了以下方法,现在得到了结果。

  • ~/projects/mylibrary 添加到 gopath
  • 为 mylibrary 运行 go install

为应用程序运行 go build 会给出:

myapplication $ go build
go: finding module for package example.com/mylibrary
myapplication.go:5:2: cannot find module providing package example.com/mylibrary: unrecognized import path "example.com/mylibrary": reading https://example.com/mylibrary?go-get=1: 404 Not Found

我可以看到它正在联系 example.com 来查找存储库(可以理解)。但我怎样才能告诉它首先在本地寻找某个地方呢?


解决方案


我已经尝试了以下方法,现在得到了结果。

将 ~/projects/mylibrary 添加到 gopath

这不是 gopath 的工作原理。在 gopath 风格下构建源代码必须位于 gopath/src 下。您似乎正在使用模块,因此摆弄 gopath 是没有用的,因为它被忽略了。

为 mylibrary 运行 go install

这基本上没有任何作用。既不在 gopath 上也不在 go 模块样式构建中。让 go 编译器在安装包和可执行文件时查找源代码是 100% 无用的。对于 go 模块风格的构建,甚至包安装实际上也是无用的。

您应该做的是遵循“如何编写 go 代码”。

对于您的设置,您必须告诉 module example.com/myapplication 在哪里可以找到 module example.com/mylibrary。这是通过 myapplications go.mod 中的 replace 指令完成的:

replace example.com/mylibrary => 

非常简单。

要点:

  • 您可以使用模块或 gopath,但不要尝试混合使用它们。
  • go install(仅)对安装可执行文件有用。
  • 如果模块 a 想使用模块 b 的本地版本:通过 a 的 go.mod 中的替换指令告诉模块 a。

How to use a module that is outside of "GOPATH" in another module? 中找到了我的答案,它指向 Can I work entirely outside of VCS on my local filesystem?

看起来有点不优雅,但看起来修复我的示例应用程序的官方方法是修改 myapplication/go.mod 对库模块名称进行查找和替换,将其替换为相对文件系统路径.

因此,要使此示例正常工作,myapplication/go.mod 将变为:

module example.com/myapplication

go 1.14

replace example.com/mylibrary => ../mylibrary

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在Go中从同一文件系统中的多个仓库导入模块》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>