从gb切换到原生Golang的方法有哪些
从gb切换到原生Golang的方法有哪些
我有一个项目(不是我的!)是用Go语言编写的,它使用gb进行构建。该项目使用了大量的依赖项("vendor"目录中的内容)。
当Go从1.11版本升级到1.12版本后,gb停止工作了 - 在链接时出现以下错误:
golang.org/x/sys/unix.libc_close_trampoline·f: relocation target golang.org/x/sys/unix.libc_close_trampoline not defined for ABIInternal (but is defined for ABI0)
. . . . .
# yubihsm-connector
yubihsm-connector
FATAL: command "build" failed: exit status 2
我想手动构建这个项目,重现如果gb build正常工作时的构建过程。不幸的是,作为一个完全的初学者,我对Go的构建系统一无所知。您能建议我如何手动构建这个项目吗?直接运行go build会出现一些错误:
$ go build
main.go:30:2: cannot find package "github.com/kardianos/service" in any of:
/usr/local/go/src/github.com/kardianos/service (from $GOROOT)
. . . . . (from $GOPATH)
. . . . .
所以肯定缺少某些东西 - 您能指出缺少什么,以及如何重新创建它吗?
谢谢!
更多关于从gb切换到原生Golang的方法有哪些的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你应该将项目的src目录放在GOPATH目录下。
更多关于从gb切换到原生Golang的方法有哪些的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
有没有什么解决办法?也许在go build执行期间向GOPATH添加某些路径?
func main() {
fmt.Println("hello world")
}
你检查过包实际所在的位置吗?在构建之前你获取过这个包吗? 你的 GOPATH 和 GOROOT 环境变量的值是什么?你检查过包是否存放在那里吗?
基于上述指导,我来回答自己的问题:以下构建命令有效:
$ cd src/yubihsm-connector && GOPATH="${GOPATH}:${PWD}/vendor" go build
我还没有尝试过:
$ GOPATH="${GOPATH}:${PWD}/src:${PWD}/vendor" go build
是的,所有软件包似乎都已下载并位于项目的 vendor/src 子目录中,即 $HOME/src/yubihsm-connector。
$ env | grep GO
CGO_LDFLAGS=-L/opt/local/lib
CGO_CFLAGS=-I/opt/local/include
GOARCH=amd64
GOROOT=/opt/local/lib/go
GOOS=darwin
GOPATH=/Users/ur20980/go
$
这是一个 gb 项目,因此目录结构如下:
--$HOME/src/
|
yubihsm-connector/
|
|
--src/yubihsm-connector (*.go files for the project itself)
|
|
--vendor/
|
|
--src (all the dependencies/packages)
从 gb 迁移到原生 Go 模块(Go Modules)是解决这个问题的标准方法。错误表明 gb 与 Go 1.12 的 ABI 内部变更不兼容,而依赖项问题是因为项目缺少 Go 模块配置。以下是步骤和示例代码,帮助你手动构建项目。
步骤 1: 初始化 Go 模块
在项目根目录下运行 go mod init 命令,以创建一个 go.mod 文件。这会将项目转换为使用 Go 模块管理依赖。假设项目在目录 myproject 中:
cd /path/to/myproject
go mod init myproject
这将生成一个 go.mod 文件,内容类似于:
module myproject
go 1.12
步骤 2: 处理 vendor 目录
如果项目有一个 vendor 目录(包含依赖项),Go 模块可以自动识别并使用它。运行以下命令来同步依赖项到 go.mod:
go mod vendor
这会基于 vendor 目录中的内容更新 go.mod 和 go.sum 文件,并确保所有依赖项被正确记录。如果 vendor 目录不完整或缺失,Go 模块会从网络下载缺失的依赖。
步骤 3: 构建项目
现在,使用 go build 命令构建项目。Go 模块会自动处理依赖解析:
go build
如果构建成功,将生成一个可执行文件(例如,在 Windows 上是 .exe,在 Linux 上是无扩展名的二进制文件)。如果仍有依赖错误,确保 vendor 目录存在或运行 go mod tidy 来清理和验证依赖:
go mod tidy
示例代码说明
假设项目有一个 main.go 文件,导入类似 github.com/kardianos/service 的包。在初始化 Go 模块后,go.mod 文件会包含这些依赖。例如,运行 go mod init 和 go mod vendor 后,go.mod 可能看起来像:
module myproject
go 1.12
require (
github.com/kardianos/service v1.2.0
// 其他依赖项...
)
然后,go build 会基于这个配置编译项目。
额外提示:如果 vendor 目录缺失
如果 vendor 目录不存在或不全,Go 模块会从代理下载依赖。你可以运行 go mod download 来预先下载所有依赖到缓存:
go mod download
然后重试 go build。
通过以上步骤,你应该能成功构建项目。如果遇到特定错误,请提供更多细节以便进一步调试。

