【问题标题】:Yocto recipe to manage Go dependencies with dep tool使用 dep 工具管理 Go 依赖项的 Yocto 配方
【发布时间】:2018-06-27 07:59:21
【问题描述】:

更新:这个问题已经解决了。我正在重新编辑问题以更新到固定状态。

我正在尝试编写一个配方,该配方使用dep 工具在构建之前解决go 相关项目的依赖关系。我正在使用“rocko”Yocto 项目分支的“poky”层。该分支提供了构建 go 编译器和 dep 依赖项工具的方法。

我的初始配方从 bitbucket 存储库中获取源代码:

GO_IMPORT = "bitbucket.org/path/to/my_project"
SRC_URI = "git://${GO_IMPORT}/protocol=http;user=${GIT_USER}:${GIT_PASS};destsuffix=${PN}-${PV}/src/${GO_IMPORT}"

然后我添加这个:

inherit go
DEPENDS += "go-dep"

在我添加这个函数之后:

do_compile_prepend() {
    dep init
    dep ensure
}

Yocto 抱怨这个错误:

run.do_compile.8543: line 118: dep: command not found

阅读下面的一些答案后,我在 poky/meta/recipes-devtools/go/go-dep_0.3.0.bb 配方文件末尾的答案中添加了建议的补丁 - 非常感谢!! :-)

BBCLASSEXTEND = "native nativesdk"

在我执行了一些 bitbake 命令之后:

$ bitbake -c cleanall go-dep-native
$ bitbake go-dep-native

Bitbake 过程正常结束,没有显示错误或警告。原生 go-dep 工具已内置到 tmp/work/x86_64-linux/go-dep-native 目录中,并正确安装到 tmp/sysroots-components/x86_64/go-dep-native/usr/bin 中。

我修改do_compile_prepend()函数如下图:

do_compile_prepend() {
    rm -f ${WORKDIR}/build/src/${GO_IMPORT}/Gopkg.toml
    rm -f ${WORKDIR}/build/src/${GO_IMPORT}/Gopkg.lock
    cd ${WORKDIR}/build/src/${GO_IMPORT}
    dep init
    dep ensure
}

我在我的食谱中这样修改 DEPENDS:

DEPENDS = "go-native go-dep-native"

请注意,go-dep 已被删除(我不需要目标设备上的dep 工具,只是为了解决对本机平台的依赖关系)。

之后,我执行这个命令:

$ bitbake <foo>

do_compile 阶段工作正常,但是 do_package 阶段出现一些错误:

ERROR: <foo>-1.0-r0 do_package: QA Issue: File '/usr/bin/dep' from <foo> was already stripped, this will prevent future debugging! [already-stripped]
ERROR: <foo>-1.0-r0 do_package: Fatal QA errors found, failing task.
ERROR: <foo>-1.0-r0 do_package: Function failed: do_package

这些错误已修复,在我的食谱末尾附加以下内容:

INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
INHIBIT_PACKAGE_STRIP = "1"
RDEPENDS_${PN}-staticdev += "bash"
RDEPENDS_${PN}-dev += "bash"

我不知道这是否是解决我的问题的最佳方法,但至少现在可以正常工作。任何改进这个食谱的建议都是受欢迎的。先感谢您! :-)

【问题讨论】:

  • 我不熟悉 yocto 但通常使用 go-dep(或一般的 go 命令),当它们通过 go get github.com/golang/dep/cmd/dep 命令获得时,可执行的 dep 命令将进入 $GOPATH /bin 目录,所以我认为您需要将 $GOPATH/bin 添加到您的 PATH 环境变量中,以便可以找到该命令。
  • 或者,如果您无法更改 PATH 变量,您可以随时将 do_compile_prepend 更改为 $GOPATH/bin/dep init

标签: go dependencies yocto recipe


【解决方案1】:

DEPENDS += "go-dep" 表示你的 target recipe 可以包含 go-dep 提供的头文件或链接库,但是你不能运行 dep 命令,如果你需要运行 dep 命令,你需要依赖 go-dep-native:

DEPENDS += "go-dep-native"

但是yocto目前不提供go-dep-native,所以需要补充一下:

BBCLASSEXTEND = "native"

meta/recipes-devtools/go/go-dep_XXX.bb.

然后你可以在do_compile_prepend()运行dep命令

【讨论】:

    【解决方案2】:

    我刚刚发送了补丁 [1] 以启用对配方的原生和 nativesdk 支持。

    1. https://patchwork.openembedded.org/patch/147390/

    【讨论】:

    • 虽然此链接可能会回答问题,但it is better 在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效
    【解决方案3】:

    假设您使用与 here 相同的配方,您应该能够在 do_compile_prepend 构建步骤中引用 ${GO_INSTALL} 变量。如果没有,请尝试使用您的 bitbake 命令运行 -c devshell,例如:

    bitbake <package name> -c devshell
    

    并寻找 dep 工具的路径。

    【讨论】:

    • 我认为这只会指向 /cmd/dep 包中的代码,而不是安装的命令本身。看看它继承的是${GOBIN} 从这里实际需要的路径:cgit.openembedded.org/openembedded-core/tree/meta/… 所以命令应该是:do_compile_prepend() { ${GOBIN}/dep init }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2019-05-05
    相关资源
    最近更新 更多