【问题标题】:Referencing a Go module that is local [duplicate]引用本地的 Go 模块 [重复]
【发布时间】:2019-11-24 17:53:10
【问题描述】:

我从本地项目(Go 模块)导入包失败。以下是我正在尝试的简介:

我像这样创建了一个 Go 模块包:

  $ cd 
  $ mkdir mymodule
  $ cd mymodule
  $ go mod init github.com/Company/mymodule

然后我在mymodule下面添加了hello.go,有点功能

// mymodule/hello.go

package mymodule

func sayHello() string {
    return "Hello"
}

go build 成功。

请注意,该模块尚未推送到 github 存储库。在推送到 github 之前,我想使用(并且可能测试)mymodule。所以我创建了另一个包,如下所示:

  $ cd 
  $ mkdir test
  $ cd test
  $ go mod init github.com/Company/test

然后,在test 目录下创建了一个新文件test.go,并在其中尝试导入mymodule,如下所示:

// test/test.go

import (
    "fmt"
    "github.com/Company/mymodule"
)

func testMyModule() {
    fmt.Println(mymodule.sayHello())
}

但是testgo build 失败并出现以下错误。什么给了?

cannot load github.com/Company/mymodule: cannot find module providing package github.com/Company/mymodule

【问题讨论】:

  • 永远不要调用包或文件“测试”。出口你的东西。即使没有模块错误,您的代码也永远不会工作。

标签: go go-modules


【解决方案1】:

当解析 go.mod 中的依赖项时,Go 将尝试通过从您提供的远程 URL 获取第三方模块来解析它们。

除非您已将其推送到 GitHub,否则远程 URL 不存在。这是当你收到这样的错误时:

cannot load github.com/Company/mymodule: cannot find module providing package github.com/Company/mymodule

本地模块有一个解决方法,您可以在 go.mod 文件中使用 replace 关键字。

replace github.com/Company/mymodule v0.0.0 => ../mymodule

这将使 Go 知道在哪里可以找到本地依赖项。只需确保使用正确的模块相对路径即可。

本地测试完成并将模块推送到存储库后,您可以从 go.mod 中删除 replace 行并使用

go get -u github.com/Company/mymodule`

让模块与您当前的项目一起正常工作。

附带说明,Go 包中的函数和变量应以大写字母开头,以便可以从包本身外部访问。

祝你好运!

【讨论】:

  • 是否可以将替换指令放在单独的文件模块文件中?不得不修改潜在的版本化文件以进行一些依赖项测试似乎很奇怪和危险..
  • @sigz 你是对的,你不想在提交 go.mod 文件时提交“替换”行。在 Go 1.18 中,现在有一个工作区文件 (go.work) 用于此目的。即,一旦您使用 Go 1.18,请使用 go.work 文件而不是替换子句,并且不要提交 go.work。见tip.golang.org/doc/go1.18
【解决方案2】:

cd 进入github.com/Company/test

试试go mod edit --replace=github.com/Company/mymodule=../mymodule

【讨论】:

    【解决方案3】:

    测试模块中的 go.mod 可以是:

    module github.com/Company/test
    require github.com/Company/mymodule v0.0.0
    replace github.com/Company/mymodule v0.0.0 => ../mymodule
    go 1.12
    

    PS。 sayHello 函数名必须大写。然后它变成公共的并且可以导出到其他模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多