为了账号安全,请及时绑定邮箱和手机立即绑定

编译错误只构建一个模块,而不是主包

编译错误只构建一个模块,而不是主包

Go
慕斯709654 2022-06-06 18:04:05
我正在制作一个 Go 程序并创建了一个模块来划分它。这是我的工作树(minimal目录位于$GOPATH/src/):  minimal/  ├── main.go  └── ui      ├── go.mod      ├── go.sum      └── ui.go在ui模块中,我有以下内容:package uiimport "github.com/satori/go.uuid"func SomeFunction() {    id, err := uuid.NewV4()    if err == nil {        print(id.String())    } else {        print(err)    }}包使用这个main模块如下package mainimport "minimal/ui"func main() {    ui.SomeFunction()}这是go.mod文件:module minimal/uigo 1.14require github.com/satori/go.uuid v1.2.0在主包文件夹中运行go build时,一切正常并生成二进制文件。但是,仅构建模块时,ui会出现以下编译错误:ui$ go build# minimal/ui./ui.go:6:10: assignment mismatch: 2 variables but uuid.NewV4 returns 1 values您可以检查https://github.com/satori/go.uuid以查看该函数返回两个值。让我感到困惑的是,构建主包可以工作,但模块却不行。这是为什么?
查看完整描述

2 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

github.com/satori/go.uuid文档似乎支持GOPATH构建。go module但是,构建会产生不一致的结果。


从它的README.md中获取简单的 API 用法:


package main

import "github.com/satori/go.uuid"

func main() {

    u, err := uuid.NewV4()

    _, _ = u, err

}

并尝试编译它go modules:


go mod init

go build


go: finding module for package github.com/satori/go.uuid

go: found github.com/satori/go.uuid in github.com/satori/go.uuid v1.2.0


./main.go:6:9: assignment mismatch: 2 variables but uuid.NewV4 returns 1 values

它被标记v1.2.0并且无法编译。


所以现在拉出最新的提交:


go get github.com/satori/go.uuid@master


go: github.com/satori/go.uuid master => v1.2.1-0.20181028125025-b2ce2384e17b

现在它编译:


go build && echo $?

0

那么这里发生了什么?


github.com/satori/go.uuid标记为成熟v1版本,因此所有 dot 版本都应该是没有重大更改的功能增强。最新的标记版本v1.2.0仅从uuid.NewV4().


最新提交(go modules推断 . 的伪点发布版本v1.2.1-0.20181028125025-b2ce2384e17b)具有与README.md.


如果此 repo 被标记为v1.2.1- 这将是一个重大更改,因为它会更改在先前v1版本中发布的函数的签名。这将违反semver规则。


结论:


该文档与GOPATH(即非go modules)构建相匹配。GOPATH构建总是拉最新的提交。


从一个go modules角度来看,虽然一个人可能能够强制构建一个有效的构建,但它看起来并不被支持。是的,git repo 使用semver标签,但没有go.mod.


我不会相信这个包有一个go modules构建。也许考虑使用github.com/google/uuid。


查看完整回答
反对 回复 2022-06-06
?
呼如林

TA贡献1798条经验 获得超3个赞

uuid软件包有不同的版本。在最新版本中,函数 NewV4() 仅返回一个变量,但在以前的版本中,它返回两个变量,其中一个是error.

您在项目的子目录中创建一个go.mod文件,因此当您在主目录中编译项目时,go-compiler 使用一个版本,而在您的ui目录中它使用另一个版本进行编译。您应该只在文件中编辑uuid包的版本。go.mod


查看完整回答
反对 回复 2022-06-06
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信