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

我正在试用 Go 的新模块系统,但在访问本地软件包时遇到了麻烦。下面的项目是在我的桌面上的一个文件夹外,我的反精神病。

我的项目结构是这样的:

/
- /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
119875 次浏览

我强烈建议您使用“走出去”工具链来解决这些问题。带有 vscode-go 插件的 VisualStudio 代码非常有用。

这里的问题是 Go 在 import 语句中需要与 $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.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"

这是从 温和的介绍到戈兰模块

作为一个初来乍到的人,我没有立即理解这个被接受的答案——顺便说一句,这个答案很棒。这里有一个更简短的答案给那些非常新的人!

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

import your.org/internal/fancy_module

但是等等! 我的代码不在网址上,发生了什么事? ?

这是围棋的聪明之处。你 假装有一个网址,即使没有。因为:

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

这些都是很好的 Evan 但是我如何导入一个相对路径呢?

问得好! 您可以通过修改 go.mod文件来导入以下内容:

module fancy_module


go 1.16


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

根据戈兰项目的结构

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

要从 /平台的本地包访问方法或结构等(它们是公共的)非常简单,如下所示

总部,请讲 主包裹

import (
p "./platform"
)


func main() {
p.Print()
}

这应该能行