你如何在包含包的回购之外构建一个轮子?
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
问题
有没有一种方法可以在不同的存储库中为包构建轮子,使得轮子的构建与在包含包的存储库中构建轮子时完全一样?
例子
考虑以下回购:
/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