【问题标题】:Using a particular version for golang dependency module使用特定版本的 golang 依赖模块
【发布时间】:2021-06-05 22:12:37
【问题描述】:

我正在尝试从github link 构建后缀导出器代码。 它依赖于go-systemd 包,如go.mod 文件github.com/coreos/go-systemd/v22 v22.0.0 中所述。 我在go.mod 文件中看到,提到的软件包版本是v22.0.0. 但是当我为此路径运行go get -u 时,它会开始下载go-systemd 的最新版本(v22.2.0),该版本在最新提交中存在问题并导致编译失败。 出现的错误是

github.com/coreos/go-systemd/v22@v22.2.0/sdjournal/journal.go:313:60: error: '_SD_ARRAY_STATIC' undeclared here (not in a function) // my_sd_id128_to_string(void *f, sd_id128_t boot_id, char s[_SD_ARRAY_STATIC SD_ID128_STRING_MAX]) ^ In file included from /usr/include/systemd/sd-journal.h:31:0, from pkg/mod/github.com/coreos/go-systemd/v22@v22.2.0/sdjournal/journal.go:27: pkg/mod/github.com/coreos/go-systemd/v22@v22.2.0/sdjournal/journal.go:313:77: error: expected ']' before numeric constant // my_sd_id128_to_string(void *f, sd_id128_t boot_id, char s[_SD_ARRAY_STATIC SD_ID128_STRING_MAX])

我想知道,如何编译任何依赖模块的特定版本,如果不是这样,或者我缺少一些选项来尊重go.mod中提到的依赖包的版本

提前非常感谢,请原谅我的 golang 知识。

【问题讨论】:

    标签: go dependencies go-modules go-get go-build


    【解决方案1】:

    不要使用-u-u 的目的是让 Go 尝试将您升级到最新的次要版本或补丁版本:

    -u 标志指示 get 更新提供依赖项的模块 命令行上命名的软件包以使用较新的次要或补丁 可用时发布。

    如果您只是想安装依赖项,请使用go get

    【讨论】:

    • 感谢您的回复,我之前也尝试过没有 '-u' 的情况,但由于同样的错误而失败。我没有安装 go 而是尝试直接从 bin 文件夹运行它。已将 GOPATH 和 GOBIN 设置为当前主目录 go/bin/go get github.com/kumina/postfix_exporter # github.com/coreos/go-systemd/sdjournal src/github.com/coreos/go-systemd/sdjournal/journal .go:1160:2:无法确定 C.my_sd_id128_to_string cgo 的名称类型:序言的 gcc 错误:src/github.com/coreos/go-systemd/sdjournal/journal.go:313:60:错误:'_SD_ARRAY_STATIC '
    【解决方案2】:

    我尝试为 Centos7 构建 podman 时发现了这个错误,注意到 _SD_ARRAY_STATIC 没有定义,所以我只是在 google 中搜索并找到了这个头文件:https://code.woboq.org/qt5/include/systemd/_sd-common.h.html。 另外,通过在我的 docker 中搜索这个文件,我发现了这个非常旧的文件:/usr/include/systemd/_sd-common.h,所以我决定修改它并添加该定义:

    /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
    
    #ifndef foosdcommonhfoo
    #define foosdcommonhfoo
    
    /***
      This file is part of systemd.
    
      Copyright 2013 Lennart Poettering
    ...
    ...
    #ifndef _SD_END_DECLARATIONS
    #  ifdef __cplusplus
    #    define _SD_END_DECLARATIONS                                \
            }                                                       \
            struct __useless_struct_to_allow_trailing_semicolon__
    #  else
    #    define _SD_END_DECLARATIONS                                \
            struct __useless_struct_to_allow_trailing_semicolon__
    #  endif
    #endif
    
    #ifndef _SD_ARRAY_STATIC
    #  if __STDC_VERSION__ >= 199901L
    #    define _SD_ARRAY_STATIC static
    #  else
    #    define _SD_ARRAY_STATIC
    #  endif
    #endif
    
    #endif
    

    瞧,它开始工作了。 TL;DR,可能您必须更新 systemd 包或至少更新 systemd C 库。

    【讨论】:

      猜你喜欢
      • 2017-04-14
      • 2014-09-09
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      • 2020-11-25
      相关资源
      最近更新 更多