从同一文件系统中的不同存储库导入 Go 模块

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


~/projects/

├── myapplication

│   ├── go.mod

│   └── myapplication.go

└── mylibrary

    ├── go.mod

    └── mylibrary.go

图书馆/go.mod


module example.com/mylibrary


go 1.14

图书馆/mylibrary.go


package mylibrary


var Message = "Hello, World!"

我的应用程序/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

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 以查找存储库(可以理解)。但是我怎么能告诉它首先在本地寻找某个地方呢?


慕的地6264312
浏览 170回答 2
2回答

杨魅力

我已经尝试了以下结果。将 ~/projects/mylibrary 添加到 GOPATH这不是 GOPATH 的工作方式。在 GOPATH 样式下构建源代码必须位于 GOPATH/src 之下。您似乎正在使用模块,因此摆弄 GOPATH 是无用的,因为它被忽略了。运行 go install for mylibrary那基本上没有任何作用。无论是在 GOPATH 还是在 Go 模块风格的构建中。让 Go 编译器在安装包和可执行文件时找到源代码是 100% 没用的。对于 Go 模块风格的构建,即使包安装实际上也无用。你应该做的是遵循“如何编写 Go 代码”。对于您的设置,您必须告诉module example.com/myapplication在哪里可以找到module example.com/mylibrary.&nbsp;这是通过replacemyapplications go.mod 中的指令完成的:replace&nbsp;example.com/mylibrary&nbsp;=>&nbsp;<file-path-to-source-folder>死的简单。带走:您可以使用 Modules 或 GOPATH,但不要尝试混合使用它们。go install(仅)对安装可执行文件有用。如果模块 A 想要使用模块 B 的本地版本:通过 A 的 go.mod 中的替换指令告诉模块 A。

猛跑小猪

在如何在另一个模块中使用“GOPATH”之外的模块?,它指出 我可以在本地文件系统上完全在 VCS 之外工作吗?.似乎有点不雅,但看起来修复我的示例应用程序的官方方法是修改myapplication/go.mod以对库模块名称进行查找和替换,将其替换为相对文件系统路径。因此,要使此示例正常工作,myapplication/go.mod将变为:module example.com/myapplicationgo 1.14replace example.com/mylibrary => ../mylibrary
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go