你如何在包含包的回购之外构建一个轮子?

How do you build a wheel outside of a repo containing the package?

问题

有没有一种方法可以在不同的存储库中为包构建轮子,使得轮子的构建与在包含包的存储库中构建轮子时完全一样?

例子

考虑以下回购:

/repo-containing-your-package
      |___ your_module/
      |___ setup.py

构建方法 A

当我从 repo-containing-your-package 中 运行 python setup.py bdist_wheel 时,它会按预期构建轮子,包括 your_module。这意味着在我安装 pip install ./dist/your_module-#.#.#-py3-none-any.whl(成功)后,我可以从命令行 运行 python -m your_module.foo

构建包时,我得到了验证我的模块已被轮子拾取的输出:

creating 'dist/your_module-#.#.#-py3-none-any.whl' and adding 'build/bar' to it
adding 'your_module/__init__.py'
etc...

构建方法 B

但是,如果我 运行 python ../repo-containing-your-package/setup.py bdist_wheel 来自 repo-containing-your-package 的兄弟存储库,它不会按预期构建轮子,因为它没有包含 your_module.这意味着在我安装 pip install ./dist/your_module-#.#.#-py3-none-any.whl(成功)后,尝试 python -m your_module.foo 失败:

Error while finding module specification for 'your_module.foo' (ModuleNotFoundError: No module named 'your_module')

通过查看构建输出确认模块未与软件包一起正确安装这一事实,其中不包括方法 A 包含的 adding 'your_module' 输出。

我知道的两个解决方案:

更改 setup.py

中的工作目录

如果可以修改安装脚本,则可以通过编程方式更改工作目录。在设置脚本中尽早添加 os.chdir 调用:

import os
from setuptools import setup

os.chdir(os.path.dirname(__file__))

setup(...)

您也可以通过其他方式更改工作目录,而无需修改安装脚本,例如在 bash:

$ pushd path/to/repo; python setup.py bdist_wheel; popd

使用pip wheel

pip 有一个子命令 wheel 从给定的 arg 构建一个轮子;此 arg 通常是包的名称,但也可以是包含安装脚本的目录。在这种情况下传递 -e,以便轮子具有正确的名称:

$ pip wheel -e path/to/repo