1

我有一个项目 A,它对 B 和 C 有源(“编辑”)依赖项(恰好在 git 子模块中)。我有一个这样的需求文件:

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

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

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

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

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)

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

4

1 回答 1

4

不要把BC放到install_requires列表中。这适用于通过奶酪店(即 pypi)发布的包。你必须把BC放在packages列表下。

请记住,install_requires当您构建 Python 版本(二进制或非二进制)时,其中的依赖项不会捆绑在一起,但其中的包packages会与您的版本捆绑在一起(您可以将它们视为“模块”而不是独立库,因为它们会是)。

为了解释这一点,如果您有自己的轮子并将其交给我并尝试安装它,nose则将从奶酪秀中获取该软件包并进行安装。B并且C也将尝试以这种方式安装,但它们失败了,因为您从未构建它们并将它们发布到 pypi 服务器。

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

如果您选择单独构建本地依赖项并将它们上传到 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'}
) 
于 2015-10-08T19:52:48.717 回答