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


80

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

2
大卫,您好,如果您认为我的回答可以回答您的问题,请考虑将其标记为答案。谢谢!
哈利尔·卡斯卡瓦奇

maven golang插件自2.3.3起也允许使用本地模块(它在构建过程中会自动添加本地路径),您可以看一下github.com/raydac/mvn-golang/tree/master/mvn-golang-示例/…
Igor Maznitsa,

Answers:


51

我强烈建议您使用go工具链,它可以解决这些问题。带vscode-go插件的Visual Studio Code非常有用。

这里的问题是Go需要相对于您$GOPATH/srcmoduleimport语句的相对路径。根据您所在的位置GOPATH,导入路径也应包括该位置。在这种情况下,import语句必须在其中包含go模块路径go.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"

对于go模块来说,这是个好主意-我必须遵循vgo的模式,在该模式下,我以模块的名称开始import语句的路径。谢谢!
大卫·阿尔什

12
等等,我很困惑。如果模块仅位于文件系统上的某个位置,则模块系统如何找到它?
Narfanator

1
如果您在模块内部go.mod,只要导入路径是以模块名称开头的完整导入路径(例如,import "github.com/my/module/pkg“`”),它就会使用包导入路径和磁盘上文件的位置在同一模块中查找包。如果您想在磁盘上其他位置的其他模块中找到软件包,则将在其中插入replace指令。此答案涵盖了有关模块结构和导入路径的更多信息
182

5
为什么每个人都继续使用网址格式?问题很明确:localmodule / localmodule.go就是这样。为什么这里有githubs和example.com?
霍姆斯

@holms的答案和上面的注释会对其进行解释,但为澄清起见,该语言没有找到内部软件包的机制,只有go工具可以。go工具取决于GOPATH或模块配置(go.mod)。本质上讲,您是在使用go工具功能将您的本地包与其他任何种类的包一样对待。另请参阅有关此问题的其他一些答案。
user4893106

106

首先让我定义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/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,导入一个特定的包像platform来自otherModule

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

这是对Golang模块的简要介绍


3
天哪,这个答案对我有很大帮助。谢谢:)
阿迪斯·阿扎尔

2
我使用了仅包含replace指令的go.mod,而构建项目不需要使用require指令。
mh-cbon's

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.