Golang模块包远程导入问题的解决方案

Golang模块包远程导入问题的解决方案 问题如下: 我对项目代码进行了重构,将特定功能移至本地包中。 但现在,从该包导入远程GitHub包时遇到了问题。

我的项目结构如下(项目位于磁盘上的“某处”):

login_watch
│   build4linux.cmd
│   Dockerfile
│   go.mod
│   go.sum
│   main.go
│
├───bin
├───log
└───pkg
    └───analyzer
            series.go
            series_test.go

也就是说,我的应用是一个名为“github.com/mustikkakeitto/login_watch”的模块,位于磁盘某处的login_watch文件夹中,并且它有一个main.go文件:

package main

import (
  "container/list"
  "fmt"
  "github.com/mustikkakeitto/login_watch/pkg/analyzer"
  "time"

  "encoding/json"
  "log"
  "net/http"

  "sync"

  "github.com/gorilla/mux"
  rotatelogs "github.com/lestrrat-go/file-rotatelogs"
) 
// 等等

main.go 将本地包导入为“github.com/mustikkakeitto/login_watch/pkg/analyzer”。 该包又导入了来自GitHub的第三方远程包“github.com/texttheater/golang-levenshtein/levenshtein”。 以下是 login_watch/pkg/analyzer/series.go 的内容:

// Package analyzer implements functions to detect series
// built from the particular phone numbers
package analyzer

import (
  "container/list"
  "fmt"
  "time"

  "github.com/texttheater/golang-levenshtein/levenshtein"

  "log"
)
// 等等

所以现在,当我启动构建/运行命令时,看到以下错误: go run . pkg\analyzer\series.go:10:2: cannot find package

我只是不明白,为什么找不到导入的库包? 当 pkg\analyzer\series.go 中的所有功能都位于 \main.go 中时,它运行得很好……

这是我的 go.mod 文件,位于项目根目录:

module github.com/mustikkakeitto/login_watch

go 1.16

require (
  github.com/gorilla/mux v1.8.0
  github.com/jonboulle/clockwork v0.2.2 // indirect
  github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
  github.com/lestrrat-go/strftime v1.0.4 // indirect
  github.com/pkg/errors v0.9.1 // indirect
  github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c // indirect
)

另外,记录一些其他信息: go version go1.16.4 windows/amd64 GOPATH=C:\Users\Alex\go 未定义环境变量 GOROOT 未定义环境变量 GO111MODULE

任何帮助都将不胜感激!


更多关于Golang模块包远程导入问题的解决方案的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

哦,哇,这确实是一个非常棘手的Bug!很高兴听到你找到并修复了它。我从未想过会是讨厌的BOM导致了这个问题。

BOM对于UTF-8来说相当无用,但通常是被允许的,并且自Go 1.1起(没写错),Go源文件也允许使用BOM。所以你这边没什么问题。

我在Go仓库的GitHub镜像中找到了一个类似的问题。(原因相同,错误信息不同。)根据那里的评论,运行 go fmt 会自动移除BOM。

而且这个问题似乎即将得到解决

更多关于Golang模块包远程导入问题的解决方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好,@christophberger,感谢你的回复!

长话短说,问题是由我的 pkg/analyzer/series.go 文件中的 UTF-BOM 文件头(EF BB BF)引起的——它似乎以某种方式阻止了编译器解析源文件。

我不太记得我是如何创建这个特定文件的,但与其他所有文件不同,它带有了这个文件头。

我刚刚在一个单独的文件夹中重新实现了你的快速测试,并确保它能工作。 然后,我逐步将原始代码块添加到 series.go 中,并每次都进行测试,最后与原始版本进行了逐字节比较。

bom

天知道,如果没有你的帮助,我要花多长时间才能找出这个该死的问题!

非常感谢!

你好,@mustikkakeitto,欢迎来到这里。

你遇到的错误确实很奇怪。 我快速测试了一下,创建了一个主包和一个分析器包:

main.go:

package main

import (
	"fmt"

	"github.com/mustikkakeitto/login_watch/pkg/analyzer"
)

func main() {
	fmt.Println(analyzer.Dist())
}

以及 pkg/analyzer/series.go:

package analyzer

import "github.com/texttheater/golang-levenshtein/levenshtein"

func Dist() int {
	return levenshtein.DistanceForStrings([]rune("a"), []rune("aa"), levenshtein.DefaultOptions)
}

然后我在根目录下运行了:

go mod init github.com/mustikkakeitto/login_watch
go mod tidy

以生成 go.mod 文件:

module

go 1.16

require github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c

并且 go run main.go 返回了 1,没有任何错误。

你可以尝试:

  • 运行 go mod tidy
  • 运行 go mod download github.com/texttheater/golang-levenshtein/levenshtein
  • 运行 go mod graph 并验证输出是否符合预期
  • 如果以上方法都不起作用,运行 go clean -modcache(但请注意,这会清除整个模块缓存,后续的编译可能会在缓存重新填满之前花费更长时间)

这是一个典型的Go模块依赖管理问题。问题在于你的go.mod文件中将github.com/texttheater/golang-levenshtein/levenshtein标记为// indirect,但你的代码直接依赖它。

解决方案如下:

  1. 更新go.mod文件 - 移除// indirect标记并确保正确导入:
module github.com/mustikkakeitto/login_watch

go 1.16

require (
    github.com/gorilla/mux v1.8.0
    github.com/jonboulle/clockwork v0.2.2 // indirect
    github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
    github.com/lestrrat-go/strftime v1.0.4 // indirect
    github.com/pkg/errors v0.9.1 // indirect
    github.com/texttheater/golang-levenshtein v1.0.1
)

注意:我移除了/levenshtein后缀,因为该包的模块路径是github.com/texttheater/golang-levenshtein

  1. 更新series.go中的导入语句
package analyzer

import (
    "container/list"
    "fmt"
    "time"
    "log"
    
    "github.com/texttheater/golang-levenshtein/levenshtein"
)
  1. 执行以下命令来同步依赖
# 清理旧的依赖缓存
go clean -modcache

# 下载所有依赖
go mod download

# 整理go.mod文件
go mod tidy

# 验证构建
go build ./...
  1. 如果问题仍然存在,尝试完整的模块重置
# 删除go.sum文件
rm go.sum

# 重新初始化模块依赖
go mod init github.com/mustikkakeitto/login_watch

# 重新下载所有依赖
go mod tidy

# 运行项目
go run main.go
  1. 检查你的实际使用代码 - 确保你正确使用了该包:
package analyzer

import (
    "github.com/texttheater/golang-levenshtein/levenshtein"
)

func CalculateDistance(str1, str2 string) int {
    // 正确使用levenshtein包
    distance := levenshtein.DistanceForStrings(
        []rune(str1),
        []rune(str2),
        levenshtein.DefaultOptions,
    )
    return distance
}

关键点:

  • // indirect标记表示该依赖不是直接导入的,但你的代码直接导入了它
  • Go模块需要明确的直接依赖声明
  • 使用go mod tidy会自动修复依赖关系并移除未使用的依赖

执行这些步骤后,你的项目应该能够正确找到并导入远程GitHub包。

回到顶部