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

Importing Go modules from a different repository in the same file system

我有两个独立的 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)
}

我没有理由相信上面的方法应该有效,因为应用程序无法找到库的位置。我怎么办?

我已经尝试了以下结果。

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

中找到了我的答案,它指向 我可以在本地文件系统上完全脱离 VCS 工作吗?.

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

因此,要使此示例有效,myapplication/go.mod 将变为:

module example.com/myapplication

go 1.14

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

I have tried the following with now results.

adding ~/projects/mylibrary to GOPATH

那不是 GOPATH 的工作方式。在 GOPATH 风格下构建源代码 必须 低于 GOPATH/src。您似乎正在使用模块,因此摆弄 GOPATH 是无用的,因为它被忽略了。

running go install for mylibrary

那基本上什么都不做。无论是在 GOPATH 上还是在 Go 模块风格的构建中。让 Go 编译器在安装包和可执行文件时找到源代码是 100% 没用的。对于 Go 模块风格的构建,即使包安装实际上也没用。

你应该做的是遵循 "How to Write Go code"。

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

replace example.com/mylibrary => <file-path-to-source-folder>

非常简单。

外卖:

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