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

时间:2018-08-26 12:32:04

标签: go vgo

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

3 个答案:

答案 0 :(得分:16)

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

这里的问题是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"

答案 1 :(得分:7)

让我定义第一个modulespackages的集合。在Go 11中,我使用gentle introduction如下:

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

module github.com/userName/moduleName

并在您的main.go

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

但是,如果它们是单独的模块,即不同的物理路径,并且您仍想导入本地packages,而不必将此远程发布到github,则可以使用replace指令来实现。 / p>

给出的模块名称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 :(得分:0)

作为一个新人,我并没有立即理解接受的答案 - 顺便说一句,这很棒。这是针对那些新人的简短回答!

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

import your.org/internal/fancy_module

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

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

  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