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
至少,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.mod 中 require 的版本完全一致才能正常工作。
在你的 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)。
正确的做法是:
- 修复版本号不匹配问题:
// go.work 文件
go 1.18
use ../../github.com/goml/gobrain
replace github.com/goml/gobrain v0.0.0-20201212123421-2e2d98ca8249 => ../../github.com/goml/gobrain
- 或者更简单的解决方案,移除
go.work中的replace指令,因为use指令已经足够:
// go.work 文件
go 1.18
use ../../github.com/goml/gobrain
- 执行命令修复依赖:
go mod tidy
go get github.com/goml/gobrain@v0.0.0-20201212123421-2e2d98ca8249
- 完整的工作区配置示例:
// 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 的依赖问题,那是另一个独立的问题,可能需要单独处理其模块兼容性问题。

