Golang中go.mod与go.work使用问题探讨

Golang中go.mod与go.work使用问题探讨 我无法满足模块要求,并且不明白原因……

ch14> egrep '^(import|\))|github.com' neural.go
import (
	"github.com/goml/gobrain"
)
ch14> go mod init neural
go: creating new go.mod: module neural
go: to add module requirements and sums:
	go mod tidy
ch14> go mod tidy
...
neural imports
	github.com/tensorflow/tensorflow/tensorflow/go imports
	github.com/tensorflow/tensorflow/tensorflow/go/core/protobuf/for_core_protos_go_proto: module github.com/tensorflow/tensorflow@latest found (v2.9.1+incompatible), but does not contain package github.com/tensorflow/tensorflow/tensorflow/go/core/protobuf/for_core_protos_go_proto
...
ch14> cat go.mod
module neural

go 1.18

我保留了 tidy 输出中的一行,尽管我认为它(目前)并不直接相关。 我手动添加到 go.mod(我之前已经执行了 go get):

require (
	github.com/goml/gobrain v0.0.0-20201212123421-2e2d98ca8249
)

我的 go.work 文件内容如下:

go 1.18

use ../../github.com/goml/gobrain
replace github.com/goml/gobrain v0.0.0-20201212123421-2e2d98ca8249 => ../../github.com/goml/gobrain

现在:

ch14> go run neural.go 
neural.go:8:2: module github.com/goml/gobrain provides package github.com/goml/gobrain and is replaced but not required; to add it:
	go get github.com/goml/gobrain@v0.0.0-20201212123421-2e2d98ca8249

这就是我不理解的地方:没有要求?怎么会没有要求呢? 为了确认它确实提供了包:

ch14> egrep --include=*.go -r ^package ../../github.com/goml/gobrain
../../github.com/goml/gobrain/util.go:package gobrain
../../github.com/goml/gobrain/persist/persist.go:package persist
../../github.com/goml/gobrain/persist/persist_test.go:package persist
../../github.com/goml/gobrain/feedforward.go:package gobrain
../../github.com/goml/gobrain/feedforward_test.go:package gobrain

更多关于Golang中go.mod与go.work使用问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

至少,go mod tidy 输出中的导入失败是导致 go.mod 被截断的原因…… 移走不相关的 Go 源代码(同一章节中的其他主题)解决了这个问题。

并且它解决了整个问题。

更多关于Golang中go.mod与go.work使用问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题出在 go.work 文件中的 replace 指令与 go.mod 文件中的 require 声明不匹配。go.work 中的 replace 指令需要与 go.modrequire 的版本完全一致才能正常工作。

在你的 go.mod 中:

require (
    github.com/goml/gobrain v0.0.0-20201212123421-2e2d98ca8249
)

但在 go.work 中,replace 指令使用了相同的版本号:

replace github.com/goml/gobrain v0.0.0-20201212123421-2d98ca8249 => ../../github.com/goml/gobrain

注意版本号中的差异:20201212123421-2e2d98ca8249 vs 20201212123421-2d98ca8249(缺少了 e2)。

正确的做法是:

  1. 修复版本号不匹配问题
// go.work 文件
go 1.18

use ../../github.com/goml/gobrain
replace github.com/goml/gobrain v0.0.0-20201212123421-2e2d98ca8249 => ../../github.com/goml/gobrain
  1. 或者更简单的解决方案,移除 go.work 中的 replace 指令,因为 use 指令已经足够:
// go.work 文件
go 1.18

use ../../github.com/goml/gobrain
  1. 执行命令修复依赖
go mod tidy
go get github.com/goml/gobrain@v0.0.0-20201212123421-2e2d98ca8249
  1. 完整的工作区配置示例
// go.work 文件
go 1.18

use (
    .
    ../../github.com/goml/gobrain
)

错误信息 “module provides package and is replaced but not required” 表明 Go 工具链检测到了 replace 指令,但在 go.mod 中没有找到对应的 require 声明。虽然你手动添加了 require,但版本号的不匹配导致工具链无法正确关联。

执行修复后,运行应该正常:

go run neural.go

对于 tensorflow 的依赖问题,那是另一个独立的问题,可能需要单独处理其模块兼容性问题。

回到顶部