python-3.x - 从文件加载的版本不符合 PEP 440
问题描述
正如标题所述,当我python -m build
使用版本文件在本地运行时出现此错误。我已阅读PEP 440,对我来说,它似乎是合规的。我无法从setuptools 的文档中看到为什么我会遇到这个问题
我真的很感激这方面的一些帮助,因为我看不到我如何能够运行调试器,python -m build
或者更具体地了解为什么_parse_version
ofsetuptools/config.py
对我的版本文件不满意。
更多细节:
我有一个项目结构如下:
src/
mypackage/
__init__.py
VERSION
pyproject.toml
setup.cfg
setup.py
版本
0.0.1
设置.cfg
name = mypackage
version = file: src/mypackage/VERSION
# etc. etc. etc.
安装程序.py
#!/usr/bin/env python
# Used to create editable installs
import setuptools
setuptools.setup()
pyproject.toml
[build-system]
# Minimum requirements for the build system to execute.
requires = [
"setuptools>=42",
"wheel"] # PEP 508 specifications.
build-backend = "setuptools.build_meta"
有关错误的更多详细信息:
File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/build_meta.py", line 154, in get_requires_for_build_wheel
return self._get_build_requires(
File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/build_meta.py", line 135, in _get_build_requires
self.run_setup()
File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/build_meta.py", line 150, in run_setup
exec(compile(code, __file__, 'exec'), locals())
File "setup.py", line 5, in <module>
setuptools.setup()
File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/__init__.py", line 153, in setup
return distutils.core.setup(**attrs)
File "/usr/lib/python3.8/distutils/core.py", line 121, in setup
dist.parse_config_files()
File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/_virtualenv.py", line 21, in parse_config_files
result = old_parse_config_files(self, *args, **kwargs)
File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/dist.py", line 778, in parse_config_files
parse_configuration(self, self.command_options,
File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/config.py", line 157, in parse_configuration
meta.parse()
File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/config.py", line 463, in parse
section_parser_method(section_options)
File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/config.py", line 436, in parse_section
self[name] = value
File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/config.py", line 220, in __setitem__
value = parser(value)
File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/config.py", line 553, in _parse_version
raise DistutilsOptionError(tmpl.format(**locals()))
distutils.errors.DistutilsOptionError: Version loaded from file: src/mypackage/VERSION does not comply with PEP 440:
ERROR Backend subproccess exited when trying to invoke get_requires_for_build_wheel
解决方案
尽管我对当前的文档或错误消息不满意,但我已经解决了这个问题,就目前而言,我觉得很容易陷入这个陷阱。
所以解决方案是MANIFEST.in
使用以下行创建一个文件:
include src/mypackage/VERSION
在我的仓库的顶层:
src/
mypackage/
__init__.py
VERSION
pyproject.toml
setup.cfg
setup.py
MANIFEST.in
此外,必须将以下内容添加到setup.cfg
[options]
include_package_data = True
来自文档:
include_package_data
如果设置为 True,这将告诉 setuptools 自动包含它在 MANIFEST.in 文件指定的包目录中找到的任何数据文件。有关详细信息,请参阅包含数据文件的部分。
setuptools文档V57.1.0 让我相信它会被包括在内:
在源代码分发中自动包含所有相关文件,无需创建 MANIFEST.in 文件,也无需在源代码树更改时强制重新生成 MANIFEST 文件。
直觉上我会认为file:
带有路径的关键字就足够了,或者由于没有这样的文件而产生的错误消息可能会更多地提示我。这在包装项目中也不明显
但我想它可以从MANIFEST.in 文档中推断出来。
我之所以这么说,是因为如果有人有任何有用的东西可以补充或反驳我目前的感受:当前指南中可能遗漏了有关使用版本文件的内容。