【问题标题】:Go modules without remote repository?没有远程存储库的 Go 模块?
【发布时间】:2020-06-03 02:48:15
【问题描述】:

我正在尝试让 Go 模块在不涉及远程存储库的情况下工作。

src 是一个本地目录,其中包含我所有的项目,以及用 Go 以外的其他语言编写的项目。为简单起见,我只显示了与我的问题相关的两个目录:

src
 ├── client
 │   ├── go.mod
 │   └── main.go
 └── lib
     ├── go.mod
     └── lib.go

go.mod 文件是通过在src/client 中运行命令go mod init client 和在src/lib 中运行go mod init lib 来创建的。

src/client/main.go:

package main

import "lib"

func main() {
    lib.Hello()
}

src/lib/lib.go:

package lib

import "fmt"

func Hello() {
    fmt.Println("Hello World")
}

我正在尝试在 main.go 中使用库 lib.go,但无论我在导入路径中放入什么,都会显示此错误:

main.go:3:8: package lib is not in GOROOT (/usr/lib/go/src/lib)

Go 版本是go1.14.3

如何从本地文件夹正确导入 Go 代码?

【问题讨论】:

  • 这里有一些关于在 go.mod 中使用本地文件路径的信息:medium.com/@adiach3nko/…(在“替换导入的模块”部分)。希望对您有所帮助。
  • 使用replace 指令。
  • 1.你永远不应该为你的任何包使用像“lib”或“foo/bar”这样的导入部分。这种类型的导入路径应该为 stdlib 保留。 2. 你的模块名称应该类似于“whatever.you.like/some/folder” 3. go.mod 中的替换指令让你可以做任何你喜欢的事情。 4. 最好的建议是:坚持如何编写 Go 代码,不要试图变得聪明,不要试图模仿其他语言可能使用的内容。

标签: go multi-module go-modules


【解决方案1】:

您可以使用replace 指令。

项目结构:

root
 ├── client
 │   ├── go.mod
 │   └── main.go
 └── lib
     ├── go.mod
     └── lib.go

go.modroot/lib 模块:

module github.com/owner/root/lib

go 1.13

go.modroot/client 模块:

module github.com/owner/root/client

go 1.13

require github.com/owner/root/lib v0.0.0

replace github.com/owner/root/lib => ../lib

这太可怕了,你真的必须为每次导入都这样做吗? 没有VCS?

没有。 replace 指令替换模块的特定版本的内容,并包括属于替代模块的包。

root
 ├── client
 │   ├── go.mod
 │   └── main.go
 └── lib
     ├── utils
     │   └── util.go
     ├── libs
     │   └── lib.go
     └── go.mod
package main

import (
    "github.com/owner/root/lib/utils"
    "github.com/owner/root/lib/libs"
)

func main() {
    //...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多