在go模块中访问本地包(go1.11)

von4xj4u  于 2023-08-01  发布在  Go
关注(0)|答案(4)|浏览(99)

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

kninwzqo

kninwzqo1#

让我定义第一个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"


这里是gentle introduction到Golang模块

qij5mzcb

qij5mzcb2#

我强烈建议你使用go工具链,它可以开箱即用地解决这些问题。Visual Studio Code with vscode-go插件非常有用。
这里的问题是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"

bksxznpy

bksxznpy3#

作为一个新来的人,我没有立即理解公认的答案-这是伟大的,顺便说一句。这里有一个简短的答案,为这些非常新的人!
In go模块/包表示为您在代码中导入的url:

import your.org/internal/fancy_module

字符串

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

这就是围棋的聪明之处。你假装有一个网址,即使没有一个。因为:
1.这使得包括更容易,因为无论您的文件位于何处,导入都使用相同的url(即使文件移动,代码也保持不变!)
1.您可能会有命名恩怨的套件。因此,google.com/go-api/user不会与your.org/internal/user处的定义冲突
1.有一天你可能会在GitHub上发布一个url,所有的代码都会正常工作

Evan,这很好,但是如何导入相对路径呢?

问得好!您可以将go.mod档案变更为具有下列行来汇入:

module fancy_module

go 1.16

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

sxpgvts3

sxpgvts34#

鉴于Golang项目的结构

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

字符串
从**/platform**的本地包访问方法或结构...等(它们是公共的)很简单,如下所示
// main.go package main

import (
p "./platform"
)

func main() {
    p.Print()
}


这个应该能用

相关问题