在实际问题之前有一点背景。随着我参与的项目的增长,用于我们正在开发的应用程序的存储库数量也在增长。以至于不断修改代码库变得难以忍受:当一个存储库中的核心库发生更改时,我们需要对使用该库的其他 Python 中间件项目进行调整。虽然这听起来并不可怕,但在 Yocto 中管理它已成为一种负担:在 Python 库的每个版本升级中,我们还需要升级所有依赖项目。经过一番思考,我们决定尝试使用 monorepo 方法来处理复杂性。我省略了选择这种方法背后的逻辑,但如果你认为这是错误的,我可以深入研究它。
1)第一阶段很容易。只需将我们中间件的每个组件都放到一个存储库中。现在我们有一个包含 20 多个 git 子模块的大型存储库。一旦我们完成过渡,子模块就会消失,但是由于在我们进行过渡时项目不会停止,因此选择子模块来跟踪更改并保持 monorepo 最新。每个子模块都是带有 setup.py/Pipfile 等的 Python 代码。那就是引导。
2) 阶段 2 是在 Yocto 中集成所有内容。事实证明,这比我预想的要困难得多。
现在我们有这个:
申请monorepo
Pipfile
python-library1/setup.py
python-library1/Makefile
python-library1/python-library1/<code>
python-library2/setup.py
python-library2/Makefile
python-library2/python-library2/<code>
...
python-libraryN/setup.py
python-libraryN/Makefile
python-libraryN/python-libraryN/<code>
当然,现在我们有
python-library1_<some_version>.bb
, python-library2_<some_other_version>.bb
在约克托。现在我们想摆脱这个版本的 hell 并坚持使用 monorepo 版本,这样我们就可以只拥有 monorepo_1.0.bb,它可以在任何部分发生任何变化时进行更新。现在我有这个 monorepo_1.0.bb (实际上,希望有,因为这种方法行不通)
SRCREV=<hash>
require monorepo.inc
monorepo.inc 如下:
SRC_URI=<gitsm://the location of the monorepo,branch=...,>
S = "${WORKDIR}/git"
require python-library1.inc
require python-library2.inc
...
require python-libraryN.inc
python-libraryN.inc:
S = "${WORKDIR}/git/python-libraryN"
inherit setuptools
由于多种原因,这种方法不起作用。基本上每一个新的
require
将覆盖 ${S}
给另一个 git/python-library
唯一要构建的包是最后一个。尽管我知道这种方法最终不会成为最终的解决方案,但我只是想告诉您我一直在努力的目标:非常简单的更新。我唯一需要做的就是更新 SRCREV(或在将来部署它时更新 ${PV}),整个堆栈将被更新。
那么,问题是如何构建用于 Python monorepo 操作的 Yocto 配方?
附言
1)monorepo 结构不是一成不变的,所以如果您有任何建议,我非常愿意接受任何批评
2)
.inc
文件结构可能不适合其他原因。此堆栈部署在十几个不同的设备上,其中一些设备 python-library_N.bb
有.bbappends
在为设备定制的其他层中。我的意思是其中一些可能需要安装不同的系统组件或一些配置和files/
修改。欢迎任何关于如何在 Yocto 中处理大型 Python 应用程序的复杂性的建议。提前致谢。
最佳答案
我目前正在研究与您相同的问题。
我发现 boost
的配方库还从“monorepo”构建了几个包。
此配方可在 poky
中找到层:
http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/recipes-support/boost
特别关注 boost.inc
文件,它构建了实际的包列表,而其他文件定义了 SRC_URI
和各种补丁。
希望有帮助!
关于python - 将 Python monorepo 应用程序集成到 Yocto 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59093345/