114

我正在尝试 Go 的新模块系统,但无法访问本地包。以下项目位于我的 gopath 之外的桌面上的一个文件夹中。

我的项目结构如下:

/
  - /platform
      - platform.go
  - main.go
  - go.mod

// platform.go
package platform

import "fmt"

func Print() {
    fmt.Println("Hi")
}

// main.go
package main

import "platform"

func main() {
    platform.Print()
}

go build main.go告诉我

cannot find module for path platform
4

3 回答 3

174

让我首先定义modules的是packages. 在 Go 11 中,我使用如下go 模块

如果两个包都在同一个项目中,您可以执行以下操作go.mod

module github.com/userName/moduleName

在你的里面main.go

import "github.com/userName/moduleName/platform"

但是,如果它们是单独的模块,即不同的物理路径,并且您仍然希望导入本地packages而不将其远程发布到 github,例如,您可以通过使用replace指令来实现这一点。

给定模块名称github.com/otherModule,并且platform正如您所称的那样,它是其中唯一的包。在您的主模块中go.mod添加以下行:

module github.com/userName/mainModule

require "github.com/userName/otherModule" v0.0.0
replace "github.com/userName/otherModule" v0.0.0 => "local physical path to the otherModule"

注意:路径应该指向模块的根目录,可以是绝对的,也可以是相对的。

在里面main.go,要导入一个特定的包,比如platformfrom otherModule

import "github.com/userName/otherModule/platform"

下面是对 Golang Modules的温和介绍

于 2019-03-25T22:41:31.983 回答
62

我强烈建议您使用开箱即用的 go toolchain 来解决这些问题。带有 vscode-go 插件的 Visual Studio Code 非常有用。

这里的问题是 Go 需要相对于您的$GOPATH/srcor modulein import 语句的相对路径。根据您在 中的位置GOPATH,导入路径也应该包括它。在这种情况下,import 语句必须包含 go module path ingo.mod

GOPATH

假设您的项目位于此处:

$GOPATH/src/github.com/myuser/myproject

您的导入路径应为:

import "github.com/myuser/myproject/platform"

VGO

假设您的 go.mod 文件是:

module example.com/myuser/myproject

您的导入路径应为:

import "example.com/myuser/myproject/platform"
于 2018-08-26T13:08:46.397 回答
17

作为一个新来的人,我并没有立即理解接受的答案——顺便说一句,这很好。对于那些非常新的人,这是一个简短的答案!

在 go 中,模块/包表示为您在代码中导入的 url:

import your.org/internal/fancy_module

可是等等!我的代码不在网址上,这是怎么回事?

这就是围棋的聪明之处。即使没有网址,您也假装有网址。因为:

  1. 这使得包含更容易,因为无论您的文件位于何处,导入都使用相同的 url(即使文件移动,代码也保持不变!)
  2. 您可以拥有具有命名冲突的包。所以google.com/go-api/user不与定义冲突your.org/internal/user
  3. 有一天你可能会在 GitHub 上发布一个 url,所有代码都可以正常工作

这一切都很好,埃文,但我如何导入相对路径?

好问题!您可以通过将go.mod文件更改为具有以下行来导入:

module fancy_module

go 1.16

replace your.org/fancy_module => ../path/to/fancy_module
于 2021-08-09T22:03:04.543 回答