使用dep工具管理Go依赖的Yocto Recipe优化咨询
解决Yocto Rocko分支构建Go项目时dep工具的问题及优化建议
最近我在Yocto Rocko分支的poky层构建Go项目时,想用dep工具在编译前解析依赖,过程中遇到了几个问题,折腾一番后终于解决了,下面分享我的处理过程和后续的优化建议:
问题背景
初始Recipe配置是从Bitbucket拉取源码,继承go类并添加go-dep依赖,同时在do_compile_prepend里执行dep init和dep ensure,但Yocto直接报错dep: command not found。
第一步:解决dep命令找不到的问题
因为我们只需要在原生构建平台(native)使用dep,不需要目标设备上安装该工具,所以做了以下调整:
- 为
go-dep添加native支持:在poky/meta/recipes-devtools/go/go-dep_0.3.0.bb末尾添加BBCLASSEXTEND = "native nativesdk" - 重新构建native版的dep工具:
$ bitbake -c cleanall go-dep-native $ bitbake go-dep-native - 更新Recipe的依赖配置,替换为native版本的工具:
DEPENDS = "go-native go-dep-native" - 调整
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 }
第二步:解决do_package阶段的stripping错误
调整后编译阶段正常,但打包时出现了already-stripped的QA致命错误,我通过添加以下配置解决了这个问题:
INHIBIT_PACKAGE_DEBUG_SPLIT = "1" INHIBIT_PACKAGE_STRIP = "1" RDEPENDS_${PN}-staticdev += "bash" RDEPENDS_${PN}-dev += "bash"
优化建议
现在Recipe可以正常运行,但还有几个可以优化的点,让构建流程更规范:
- 避免修改上游poky层文件:直接修改
go-dep_0.3.0.bb不是最佳实践,建议在自己的自定义层中创建go-dep_0.3.0.bbappend文件,在里面添加BBCLASSEXTEND = "native nativesdk",这样不会污染上游代码,也方便后续Yocto版本升级。 - 提前固化依赖文件:如果项目的依赖是固定的,建议在本地提前运行
dep init和dep ensure,把生成的Gopkg.toml和Gopkg.lock提交到源码仓库。这样Yocto构建时就不需要每次执行dep命令,既节省构建时间,又能避免网络不稳定导致的依赖拉取失败问题。 - 精准控制stripping操作:
INHIBIT_PACKAGE_STRIP = "1"会全局禁用stripping,其实可以用STRIP_EXCLUDE只排除特定文件,比如:
这样既保留其他文件的stripping优化,又解决了dep工具的报错问题。STRIP_EXCLUDE += "/usr/bin/dep" - 检查不必要的依赖:添加
bash到staticdev和dev包的依赖,需要确认是否真的必要。如果项目在开发/静态包阶段不需要bash,这个依赖可以去掉,避免引入不必要的包。
内容的提问来源于stack exchange,提问作者aicastell
相关产品推荐
相关产品推荐

