【问题标题】:Locally importing package本地导入包
【发布时间】:2021-09-16 12:39:01
【问题描述】:

我有一个包,我想用foo 分解我的代码,它位于一个名为utils 的子目录中。当我尝试将其导入我的 main.go 时,它找不到它。不知道我做错了什么。

运行go build时出错

错误: main.go:7:2: local import "./utils/csrf" in non-local package

所以我的文件夹结构如下:

github.com/project
  /utils
    foo.go
  main.go

包是这样写的:

package foo

import (
  "fmt"
)

func Bar() {
  fmt.Printf("function")
}

去模组:

module github.com/project

go 1.15

我尝试导入的内容与我的 main.go 文件中的一样。

import (
  "fmt"
  "github.com/project/utils/foo"
)

【问题讨论】:

  • 您缺少go.mod 文件。在项目目录中运行以下命令:go mod init github.com/project.
  • @mkopriva 抱歉编辑添加此内容。我确实有一个设置。
  • 我正在使用 vscode 并假设它会根据需要向 go.mod 添加项目?
  • 确切的错误信息是什么?如果您使用的是 IDE,请尝试在不使用 IDE 的情况下编译程序,即在项目目录中运行 go build,如果可以,则表示 IDE 配置不正确或支持蹩脚。
  • 您问题中的代码与错误不匹配。您声明main.go 文件中的导入是"fmt""github.com/project/utils/foo",但错误抱怨"./utils/csrf"。要么您在错误的项目中运行 go build,要么问题中的代码与您的实际代码相去甚远。

标签: go package go-modules


【解决方案1】:

首先,在某处创建一个文件夹utils。你不需要做任何事情 github.com/project 文件夹。只需简单地创建一个utils 文件夹,并将其放在硬盘上的某个位置。然后进入该文件夹,然后执行go mod init github.com/project/utils。然后制作utils/foo.go:

package utils
import "fmt"

func Bar() {
   fmt.Println("function")
}

然后创建一个文件夹utils/utils。然后制作一个文件utils/utils/main.go

package main
import "github.com/project/utils"

func main() {
   utils.Bar()
}

然后执行go build。完成。

【讨论】:

  • 所以最后一件事就是答案。我本可以发誓我确实已经为该模块进行了构建。但在那之后,当我在 main.go 中使用它的方法时,vscode 能够自动导入它。 :facepalm: 谢谢大家,尤其是史蒂文。 :)
【解决方案2】:

错误消息main.go:7:2: local import "./utils/csrf" in non-local package 来自here。除非出现意外错误,否则这意味着您的 main.go 确实看起来像:

import (
  "fmt"
  "github.com/project/utils/foo"
)

正如你所描述的,但更像是:

import (
  "fmt"
  "./utils/foo"
)

但是,relative import paths 不能在模块模式下的 import 语句中使用。 (由于go 命令中的错误,您在模块模式下收到的实际错误消息有些令人困惑,我已为此提交了https://golang.org/issue/47088。)

在模块模式下,go.mod 文件中声明的模块路径(对于您的示例可能为 module github.com/project)是导入路径的前缀,您打算在 import 语句中使用完整路径。

所以这里的解决方案很可能:

  1. cdproject 文件夹。
  2. 运行go mod init github.com/project
  3. 更改import 语句以在整个项目中使用完整路径而不是相对路径:
    $ sed -i 's,"\./utils,"github.com/project/utils,' $(find -name *.go)
    

这应该将您的 main.go 更改为 实际上 阅读:

import (
  "fmt"
  "github.com/project/utils/foo"
)

但是现在还有一步:Go 只支持每个目录一个包,并且在 .go 源文件中使用 package 指令声明的包名称是(可能令人困惑!)不是 包导入路径的后缀——完全独立。

所以为了使import 语句起作用,你需要一个额外的目录结构层:

  1. mkdir utils/foo
  2. mv utils/foo.go utils/foo/foo.go

现在您有一个模块 github.com/project,其中包含两个包:github.com/project 带有源文件 ./main.gogithub.com/project/utils/foo 带有源文件 ./utils/foo/foo.go

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2013-04-29
    相关资源
    最近更新 更多