从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

6 回复

你应该将项目的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.modgo.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 initgo 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

通过以上步骤,你应该能成功构建项目。如果遇到特定错误,请提供更多细节以便进一步调试。

回到顶部