如何解决导入本地Go模块的"无法找到路径X的模块"?

vas*_*vas 6 go vgo

在我的Go项目中,我想将一些通用功能分解为Go模块,与主项目分开.我在GOPATH之外这样做是为了与go的未来保持一致.我不想在GitHub或其他任何地方发布模块.

我将此模块导入主项目的所有尝试都会导致:

cannot find module for path X
Run Code Online (Sandbox Code Playgroud)

我已经go mod init X在模块的文件夹中运行了.其go.mod文件的内容是:

module X
Run Code Online (Sandbox Code Playgroud)

构建或安装此模块似乎什么都不做.我没有发现它的迹象$GOPATH/pgk/mod.

我尝试了各种import语句:

救命!

Cso*_*mai 13

如果您不想使用 Go 模块,则不需要。从 Go v1.13 开始,默认使用 go 模块。因此,如果您不想这样做,您需要明确告知。

例子:

main.go:

package main

import (
    "fmt"

    "./pakk"
)

func main() {
    fmt.Println("Hello" + pakk.World())
}
Run Code Online (Sandbox Code Playgroud)

帕克/pakk.go:

package pakk

func World() string {
    return " world"
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,运行go run main.go将输出

build command-line-arguments: cannot find module for path .../pakk
Run Code Online (Sandbox Code Playgroud)

但运行

GO111MODULE=off go run main.go
Run Code Online (Sandbox Code Playgroud)

将输出

Hello world
Run Code Online (Sandbox Code Playgroud)

  • 我测试了这个“GO111MODULE=off”选项,它起作用了。 (2认同)
  • 如果我想要本地包 pakk 但也想要其他外部模块,有没有办法做到这一点?现在,如果我关闭 GO111MODULE=off ,看起来就像找不到外部包,例如“github.com/go-chi/chi” (2认同)

Ham*_*nis 12

所以你写了一个Go"library"模块:

  • 你不想在GitHub上或其他地方发布
  • 您想要在项目中导入和使用它("主"模块).

使用该replace指令来解决此问题.

给定模块名称"X",在主模块中添加以下行:

require "X" v0.0.0
replace "X" v0.0.0 => "{local path to the X module}"
Run Code Online (Sandbox Code Playgroud)

路径应指向模块的根目录,可以是绝对路径或相对路径.

要从模块X导入package util:

import "X/util"
Run Code Online (Sandbox Code Playgroud)

(您不导入模块.您从模块导入包.)


说明

Go的模块功能专为公开发布的模块而设计.通常,模块的名称既是其唯一标识符,也是其公共存储库的路径.当go.mod使用该require指令声明模块依赖时,Go将自动在该路径中查找并检索模块的指定版本.

(另请参阅Go Modules FAQ,我可以在本地文件系统上完全在VCS之外工作吗?)

例如,如果您的go.mod文件包含require github.com/some/dependency v1.2.3,Go将从该路径的GitHub检索模块.但如果它包含require X v0.0.0,"X"不是实际路径,您将得到错误cannot find module for path X.

replace指令允许您为给定的模块标识符和版本指定替换路径.您需要执行此操作的原因很多,例如在将模块推送到公共存储库之前测试模块的更改.但您也可以使用它将模块标识符绑定到您不打算发布的本地代码.

希望这可以帮助.

  • 天哪,希望这是谷歌上的第一名。在我最终得到这个正确的解释之前,我必须阅读很多东西。 (2认同)