如何为需要其他源项目的项目造轮子?

How to build wheels for a project that requires other source projects?

我有一个项目 A,它对 B 和 C(碰巧在 git 子模块中)具有源 ("edit") 依赖性。我有一个这样的需求文件:

[requirements.txt]
nose
-e B/src
-e C/src

我的 setup.py 将这些包列为 deps:

[setup.py]
install_requires=[nose, B, C]

但是当我在另一个客户端项目 X 中安装 wheel 时,找不到这些 "source" 依赖项(它们不是 A 的 wheel 的一部分)。

Collecting B (from A==0.0.1)
Could not find a version that satisfies the requirement B (from A==0.0.1) (from versions: )
No matching distribution found for B (from A==0.0.1)

我是否必须为每个子项目创建单独的二进制分发版?

不要将 BC 放入 install_requires 列表。这是针对通过奶酪店(即 pypi)发布的包。您必须将 BC 放在 packages 列表下。

请记住,在构建 python 版本(二进制或非二进制)时,install_requires 中的依赖项并未捆绑,但 packages 中的包与你的版本捆绑在一起(你可以将它们视为 "modules" 而不是独立的库,因为它们本来就是)。

为了解释这一点,如果你有,如果你构建了你的轮子并将它交给我,我尝试安装它,nose 包将从奶酪展中获取并安装。 BC 也将尝试以这种方式安装,但它们失败了,因为您从未构建它们并将它们发布到 pypi 服务器。

所以你实际上有2个选择。第一个是单独构建 BC 并将它们中的每一个发布到 pypi 服务器(或您自己的 pypi 服务器)。另一种选择是将 BC 作为包包含在 setup.py 文件中。这样,当您构建主项目时,BC 都包含在您的版本中(即您的案例中的 wheel 文件)。

如果您选择单独构建本地依赖项并将它们上传到 pypi 服务器,那么您的设置应该可以正常工作。否则,如果您选择其他选项,则必须将本地依赖项移至包列表。这是您在这种情况下可能创建的 setup.py 示例:

from setuptools import setup

setup(
    name='myproject',
    version='1.0.0',
    author='myself',
    author_email='myself@mywebsite.com',
    install_requires=['nose'],
    packages==['B', 'C']
    package_dir={'A': 'path/to/A/directory', 'B': 'path/to/B/dir'}
)