从 monorepo 安装 Python 包

hbl*_*nco 7 python git pip monorepo python-poetry

我们有一个私有的 git monorepo,它托管着许多 Python 包。Poetry 是最初为该项目选择的依赖管理工具。无论如何,由于这个 Poetry 问题,涉及创建新文件的解决方案不会被接受setup.py

\n

结构的简化版本:

\n
git-monorepo\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkg-1\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkg\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mod1.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkg-2\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkg\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mod2.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkg\n    \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n
Run Code Online (Sandbox Code Playgroud)\n

库分发包lib独立于任何其他包。然而,pkg-1取决于libpkg-2取决于pkg-1lib

\n

所以,问题是:

\n

pip从这个 monorepo 安装软件包的正确方法是什么?

\n

让我们考虑一下我们尝试安装的示例pkg-1,其中pkg-1/pyproject.toml包括以下行:

\n
...\n\n[tool.poetry.dependencies]\nlib = {path = "../lib/"}\n\n...\n
Run Code Online (Sandbox Code Playgroud)\n

运行结果,如VCS 支持文档pip中所述:

\n
git-monorepo\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkg-1\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkg\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mod1.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkg-2\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkg\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mod2.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkg\n    \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n
Run Code Online (Sandbox Code Playgroud)\n

ger*_*ben 0

上述设置的问题在于依赖关系被指定为路径依赖关系。安装它时,它使用该路径依赖项。我在 python monorepo 中遇到了同样的问题,我想将包也共享给其他项目。我找到了两种适合我的方法:

  1. 在 CI/CD 构建管道中,在pyproject.toml创建轮子之前编辑(已发布到 pypi 存储库)
  2. 首先创建wheel(或.tar.gz)工件,然后对其进行修改(通过提取它,替换路径依赖项,然后再次压缩它)。

我在这里解释了完整的方法。

但是,它不适用于git+https://...
您需要在某个地方有一个(私人)pypi 存储库。Gitlab 为每个项目提供一个,我在此处的演示项目中使用了它