如何为需要其他源项目的项目造轮子?
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)
我是否必须为每个子项目创建单独的二进制分发版?
不要将 B
和 C
放入 install_requires
列表。这是针对通过奶酪店(即 pypi)发布的包。您必须将 B
和 C
放在 packages
列表下。
请记住,在构建 python 版本(二进制或非二进制)时,install_requires
中的依赖项并未捆绑,但 packages
中的包与你的版本捆绑在一起(你可以将它们视为 "modules" 而不是独立的库,因为它们本来就是)。
为了解释这一点,如果你有,如果你构建了你的轮子并将它交给我,我尝试安装它,nose
包将从奶酪展中获取并安装。 B
和 C
也将尝试以这种方式安装,但它们失败了,因为您从未构建它们并将它们发布到 pypi 服务器。
所以你实际上有2个选择。第一个是单独构建 B
和 C
并将它们中的每一个发布到 pypi 服务器(或您自己的 pypi 服务器)。另一种选择是将 B
和 C
作为包包含在 setup.py
文件中。这样,当您构建主项目时,B
和 C
都包含在您的版本中(即您的案例中的 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'}
)
我有一个项目 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)
我是否必须为每个子项目创建单独的二进制分发版?
不要将 B
和 C
放入 install_requires
列表。这是针对通过奶酪店(即 pypi)发布的包。您必须将 B
和 C
放在 packages
列表下。
请记住,在构建 python 版本(二进制或非二进制)时,install_requires
中的依赖项并未捆绑,但 packages
中的包与你的版本捆绑在一起(你可以将它们视为 "modules" 而不是独立的库,因为它们本来就是)。
为了解释这一点,如果你有,如果你构建了你的轮子并将它交给我,我尝试安装它,nose
包将从奶酪展中获取并安装。 B
和 C
也将尝试以这种方式安装,但它们失败了,因为您从未构建它们并将它们发布到 pypi 服务器。
所以你实际上有2个选择。第一个是单独构建 B
和 C
并将它们中的每一个发布到 pypi 服务器(或您自己的 pypi 服务器)。另一种选择是将 B
和 C
作为包包含在 setup.py
文件中。这样,当您构建主项目时,B
和 C
都包含在您的版本中(即您的案例中的 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'}
)