我刚刚开始将对 setup.py 的直接调用转换为使用构建模块 pyproject.toml 来提供推荐分离前端调用后端构建机制(在我的例子中是 setuptools)。当我试图传达 --tag-build 选项以供 setuptools 使用时,我遇到了一个问题(我们的 CI/CD 构建需要更细粒度的 --tag-date 选项提供的默认时间戳,因为如何pip 缓存有效,需要在时间戳中包含 HHMMSS 值)。 我使用了以下示例命令行(使用Python 3.10.8)
python3 -m build --wheel '--config-setting=--build-option=-v' '--config-setting=--build-option=egg_info' '--config-setting=--build-option=-bpost20240119000000'
踏过
build/__main__.py
的主要功能,上面的命令行似乎已正确解析,config_settings列表具有后端的各种参数: config_settings == { '--build-option': [ '-v', 'egg_info ', '-bpost20240119000000']}。我的理解是这个列表然后被传送到后端。不幸的是,我还没有弄清楚为什么Pycharm调试失败在_build_in_isolated_env()
。
我希望其他人能够分享他们如何获得构建模块使用的这些 Egg_info 选项来达到预期的效果。 或者,我可以采取额外的步骤来找出根本原因。
我感谢任何反馈、建议。 MTIA。
构建调用的输出:
$python3 -m build --wheel '--config-setting=--build-option=-v' '--config-setting=--build-option=egg_info' '--config-setting=--build-option=-bpost20240119000000' |& tee build-failure.log
* Creating venv isolated environment...
* Installing packages in isolated environment... (setuptools>=42, wheel)
* Getting build dependencies for wheel...
* Installing packages in isolated environment... (setuptools>=50.3.2, wheel, wheel>=0.35.1)
* Building wheel...
/tmp/build-env-9qdhq0jy/lib/python3.10/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsWarning: `install_requires` overwritten in `pyproject.toml` (dependencies)
corresp(dist, value, root_dir)
/tmp/build-env-9qdhq0jy/lib/python3.10/site-packages/setuptools/sandbox.py:13: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
import pkg_resources
usage: _in_process.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: _in_process.py --help [cmd1 cmd2 ...]
or: _in_process.py --help-commands
or: _in_process.py cmd --help
error: option --dist-dir not recognized
ERROR Backend subprocess exited when trying to invoke build_wheel
pkg_resources 不存在于 setup.py、setup.cfg、pyproject.toml 中,也不存在于 --dist-dir 中。
python3 ./setup.py egg_info -bpost20240119000000 bdist_wheel
调用没有问题,创建了预期的 dist/ioif_core-0.8.4.post20240119000000-py3-none-any.whl。
---- 第一次更新 ----
在构建选项中添加 --no-isolation -> 生成轮子,并将其放置在 dist/ 中,但未使用 -b 选项(轮子文件:dist/ioif_core-0.8.4-py3-none-any.whl) 。因此,我需要深入研究新的问题:使用隔离的 virtualenv 与不使用隔离的 virtualenv 有什么问题; Egg_info -b 发生了什么事
---- 第二次更新 ----
这是使用setuptools 60.2.0。 现在 PEP517 打包的理念是否应该相应地设置元数据,而不是依赖于诸如 Egg_info -b 之类的旧命令?那么后端应该期望项目元数据能够驱动版本控制等方面吗?因此,虽然 setuptools 仍然记录使用 Egg_info -b 来标记每日构建等,但构建前端没有传达这些选项(我看到 build_meta.py 中的 _buid_with_temp_data() 没有传达非全局-构建过程的选项),仅更新元数据似乎可行。
本着这种精神,我修改了(到目前为止)setup.py,以从 pyproject.toml 或 setup.cfg 中提取(在调用 setup 之前)版本值,如果设置了,则使用定义格式字符串的 env 变量,生成生成的版本值,作为命名参数传递给安装程序)。这很好用,但前提是在调用 python3 -m build 时使用 --no-isolation。我有一个打印语句,显示两种情况下的正确版本值,但除非我使用 --no-isolation,否则不会使用它。我喜欢 PEP517 中的隔离环境概念,更愿意使用它,但在 CI/CD 作业中,没有太多附加值,因此 -n 看起来可以节省时间。 是否有一个构建选项可以不保留临时构建环境,以便可以对其中的内容进行构建后分析?
我可以通过以下方式添加
--tag-build
:
python3 -m build -C--global-option="egg_info -bpost20240119000000"