在 go 模块中访问本地包 (go 1.11)

Accessing local packages within a go module (go 1.11)

我正在试用 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

我强烈建议您使用 go 工具链,它开箱即用地解决了这些问题。 Visual Studio 使用 vscode-go 插件的代码非常有用。

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

中包含 go 模块路径

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"

先定义一下modulespackages的集合。在 Go 11 中,我像下面这样使用 go modules

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

module github.com/userName/moduleName

在你的main.go

里面

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

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

鉴于模块名称 github.com/otherModuleplatform,如您所称,是其中唯一的包。在主模块的 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 中,从 otherModule:

导入特定的包,如 platform
import "github.com/userName/otherModule/platform"

这是 Golang 模块gentle introduction

作为新手,我没有立即理解接受的答案 – 顺便说一句,这很好。这是为那些非常新的人准备的更简短的答案!

在 go modules/packages 中表示为您在代码中导入的 url:

import your.org/internal/fancy_module

但是等等!我的代码不在 url,这是怎么回事??

这就是围棋的高明之处。你假装有一个url,即使实际上没有。因为:

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

Evan 太棒了,但是如何导入相对路径?

好问题!您可以通过将 go.mod 文件更改为包含此行来导入:

module fancy_module

go 1.16

replace your.org/fancy_module => ../path/to/fancy_module

给定 Golang 项目结构

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

/platform 的本地包访问方法或结构...等(public)很简单,如下所示

// main.go 主包

import (
p "./platform"
)

func main() {
    p.Print()
}

这应该有效