构建一个包含两个独立模块的Python包,其中一个是git子模块

问题描述 投票:0回答:2

我正在尝试构建一个用于分发的Python包,其中包含两个独立的模块(

module1
module2
),但具有非标准目录布局。

这两个模块包含在不同的存储库中(

module1-repo
module2-repo
),并且都具有标准布局。但是,我想将
module2
的源代码作为 git 子模块包含在
module1-repo
中。

如何构建这个包?

  • 我可以使用任何构建系统,只要它生成可以发布到 PyPi 的包即可。
  • 无法更改
    module2-repo
    的文件/目录结构(它是我想保持同步的另一个存储库的分支)。
  • 可以更改
    module1-repo
    的目录结构。
  • 我不想将
    module2
    作为
    module1
    的子模块。我希望将它们都作为顶级包。
  • 我想避免多步构建。

我在哪里

(当前)目录结构是:

module1-repo
├── pyproject.toml
├── module1
│   ├── __init__.py
│   ├── ...
└── module2-repo (git submodule)
    ├── setup.py
    └── module2
        ├── __init__.py
        └── ...

pyproject.toml 是(基于 Poetry 文档):

[tool.poetry]
name = "module1"
...
packages = [
    { include = "module1" },
    { include = "module2/*.py", from="module2"},
]

...

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

这将构建一个具有以下结构的包:

module1.tar.gz
├── LICENSE.txt
├── module1
│   ├── __init__.py
│   └── ...
├── PKG-INFO
├── pyproject.toml
├── README.md
└── module2
    └── module2
        ├── __init__.py
        └── ...

但是,这不会正确导入

module2
,因为有一个额外的子目录。

python pypi python-packaging python-poetry
2个回答
0
投票

如果您只想将

module1
module2
公开为新的分发包中的导入包包,您可以使用配置

[tool.poetry]
name = "my-distribution"
...
packages = [
    { include = "module1" },
    { include = "module2", from="module2-repo" },
]

请注意,这会忽略

module2-repo
中存在的任何分发包元数据。
setup.py
文件和
module2-repo
子模块中可能存在的其他构建系统元数据将被完全忽略。


0
投票

由于

module2-repo
似乎已经是一个发行包(假设它包含顶级
setup.py
文件,因此您真正想要的可能是将
module2-repo
声明为新发行版的依赖项。

如果是这种情况,您只需将

module2-repo
列为 git 要求:

[tool.poetry.dependencies]
module2-distribution = { git = "https://git.example.com/module2-repo.git", rev = "abcd1234" }
© www.soinside.com 2019 - 2024. All rights reserved.