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

Dav*_*lsh 40 go vgo

我正在尝试Go的新模块系统,并且无法访问本地软件包.以下项目位于我的gopath外部桌面上的文件夹中.

我的项目结构如下:

/
  - /platform
      - platform.go
  - main.go
  - go.mod
Run Code Online (Sandbox Code Playgroud)
// platform.go
package platform

import "fmt"

func Print() {
    fmt.Println("Hi")
}
Run Code Online (Sandbox Code Playgroud)
// main.go
package main

import "platform"

func main() {
    platform.Print()
}
Run Code Online (Sandbox Code Playgroud)

go build main.go 告诉我

cannot find module for path platform
Run Code Online (Sandbox Code Playgroud)

Eva*_*ran 54

作为一个新来的人,我没有立即理解接受的答案 \xe2\x80\x93\xc2\xa0 顺便说一下,这很棒。这是针对那些新人的简短答案!

\n

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

\n
import your.org/internal/fancy_module\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

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

埃文,这一切都很棒,但是我如何导入相对路径呢?

\n

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

\n
module fancy_module\n\ngo 1.16\n\nreplace your.org/fancy_module => ../path/to/fancy_module\n
Run Code Online (Sandbox Code Playgroud)\n

  • 你是我的救星,我的伙计!我知道不鼓励“替换”只是因为这是不好的做法,但这正是我挽救一个有点过时的项目所需要的。 (4认同)
  • 非常感谢。我决定向我的孩子展示一些“编程”,但立即遇到了一个问题:Go 看不到本地模块。我不想向那些还不知道“变量”含义的人解释什么是 GitHub。 (3认同)

Muh*_*man 41

首先让我定义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"
Run Code Online (Sandbox Code Playgroud)

注意:路径应指向模块的根目录,并且可以是绝对路径或相对路径。

里面main.go,导入一个特定的包像platform来自otherModule

import "github.com/userName/otherModule/platform"
Run Code Online (Sandbox Code Playgroud)

这是对Golang模块的简要介绍

  • 我的问题是为什么模块必须有 github.com...问题是谈论本地文件,为什么答案必须包含 url ???这是我的问题...像其他编程语言一样使用文件路径是否困难?或者我们必须将所有内容都视为外部 url? (9认同)
  • 我使用了仅包含替换指令的 go.mod,构建项目不需要 require 指令。 (3认同)
  • 天哪,这个答案对我有很大帮助。谢谢 :) (2认同)

Hal*_*lci 28

我强烈建议你使用go工具链,它可以解决这些问题.使用vscode-go插件的Visual Studio代码非常有用.

这里的问题是Go需要相对于您$GOPATH/srcmoduleimport语句的相对路径.根据您所处的位置GOPATH,导入路径也应包含该路径.在这种情况下,import语句必须包含go模块路径go.mod

GOPATH

假设您的项目位于此处:

$GOPATH/src/github.com/myuser/myproject
Run Code Online (Sandbox Code Playgroud)

您的导入路径应为:

import "github.com/myuser/myproject/platform"
Run Code Online (Sandbox Code Playgroud)

VGO

假设你的go.mod文件是:

module example.com/myuser/myproject
Run Code Online (Sandbox Code Playgroud)

您的导入路径应为:

import "example.com/myuser/myproject/platform"
Run Code Online (Sandbox Code Playgroud)

  • 为什么大家都继续使用 url 格式?问题非常明确:localmodule/localmodule.go 就是这样。为什么这里有 github 和 example.com? (15认同)
  • 等等,我很困惑。如果模块仅位于文件系统上的某个位置,则模块系统如何找到它? (5认同)
  • 我的问题是为什么模块必须有 `github.com`...问题是谈论本地文件,为什么答案必须包含 url ???这是我的问题...像其他编程语言一样使用文件路径是否困难?或者我们必须将所有内容都视为外部 url? (2认同)