如何在Yocto中用Shell函数覆盖继承的NPM相关Python函数?
解决Yocto中仅将NPM包构建产物打入镜像的问题
核心思路
保留inherit npm以获取必要的构建环境(避免移除后的依赖报错),通过重写构建/安装步骤、调整文件打包规则,仅将npm run build的产物纳入镜像。
具体实现步骤
保留npm继承
不要移除inherit npm,这条指令会自动引入Yocto提供的nodejs、npm工具链及构建所需的变量配置,是避免报错的关键。重写编译步骤,执行构建命令
在配方中覆盖do_compile函数,明确执行构建命令生成产物:do_compile() { npm run build }注:如果你的项目构建命令不是
npm run build,替换为实际命令即可。重写安装步骤,仅复制构建产物
覆盖do_install函数,只将构建产物(通常在dist目录,根据项目调整路径)复制到目标安装路径,忽略源码、node_modules等无需打包的内容:do_install() { install -d ${D}${datadir}/${PN} cp -r ${S}/dist/* ${D}${datadir}/${PN}/ }${D}是Yocto的目标根目录变量,${datadir}对应系统共享数据目录(通常为/usr/share),${PN}是当前包名。- 若构建产物在其他目录,替换
${S}/dist为实际路径即可。
调整文件打包规则
设置FILES_${PN}变量,明确指定镜像中仅包含安装的构建产物,排除默认的npm相关文件:FILES_${PN} = "${datadir}/${PN}/"
完整配方示例
SUMMARY = "自定义NPM项目构建产物包" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=xxxxxxxxxxxxxx" SRC_URI = "git://github.com/your/repo.git;branch=main" S = "${WORKDIR}/git" inherit npm do_compile() { npm run build } do_install() { install -d ${D}${datadir}/${PN} cp -r ${S}/dist/* ${D}${datadir}/${PN}/ } FILES_${PN} = "${datadir}/${PN}/"
关键说明
- 默认的
npm_do_configure会执行npm install安装构建依赖,这一步仅在构建机器上完成,不会被打包进镜像,无需额外处理。 - 若之前覆盖函数时报错,检查是否在
inherit npm之后定义重写函数,同时确保函数语法符合Yocto的Shell脚本规范(无语法错误、变量引用正确)。
内容的提问来源于stack exchange,提问作者Jomaar
相关产品推荐
相关产品推荐

