从文件加载的版本不符合 PEP 440

Oli*_*ren 7 setuptools python-3.x

正如标题所述,当我python -m build使用版本文件在本地运行时,出现此错误。我已阅读PEP 440,对我来说,它似乎符合要求。我从setuptools 的文档中看不到为什么我会遇到这个问题

我真的很感激对此的一些帮助,因为我不知道如何运行调试器python -m build或进一步了解为什么_parse_versionofsetuptools/config.py对我的版本文件不满意。

更多细节:

我有一个项目结构如下:

src/
   mypackage/
      __init__.py
      VERSION
pyproject.toml
setup.cfg
setup.py

Run Code Online (Sandbox Code Playgroud)

版本

0.0.1
Run Code Online (Sandbox Code Playgroud)

安装程序.cfg

src/
   mypackage/
      __init__.py
      VERSION
pyproject.toml
setup.cfg
setup.py

Run Code Online (Sandbox Code Playgroud)

安装程序.py

0.0.1
Run Code Online (Sandbox Code Playgroud)

pyproject.toml

name = mypackage
version = file: src/mypackage/VERSION
# etc. etc. etc.
Run Code Online (Sandbox Code Playgroud)

有关错误的更多详细信息:

#!/usr/bin/env python
# Used to create editable installs
import setuptools

setuptools.setup()

Run Code Online (Sandbox Code Playgroud)

Oli*_*ren 5

我已经解决了这个问题,尽管我对当前的文档或错误消息不满意,但就目前情况而言,我觉得很容易陷入这个陷阱。

所以解决方案是在我的存储库的顶层创建一个MANIFEST.in包含以下行的文件 :include src/mypackage/VERSION

src/
   mypackage/
      __init__.py
      VERSION
pyproject.toml
setup.cfg
setup.py
MANIFEST.in
Run Code Online (Sandbox Code Playgroud)

此外,还必须将以下内容添加到setup.cfg

src/
   mypackage/
      __init__.py
      VERSION
pyproject.toml
setup.cfg
setup.py
MANIFEST.in
Run Code Online (Sandbox Code Playgroud)

来自文档

include_package_data如果设置为 True,这将告诉 setuptools 自动包含在 MANIFEST.in 文件指定的包目录中找到的任何数据文件。有关详细信息,请参阅包含数据文件部分。

setuptools文档V57.1.0 让我相信它将被包含在内:

自动包含源发行版中的所有相关文件,无需创建 MANIFEST.in 文件,也无需在源树更改时强制重新生成 MANIFEST 文件。

直觉上我会认为file:带有路径的关键字就足够了,或者由于没有这样的文件而产生的错误消息可能会为我提供更多线索。从包装项目中也看不出来这一点

但我想可以从MANIFEST.in 文档中推断出来。

我之所以这么说,是因为以防万一有人有任何有用的东西可以添加或反驳我目前的感觉:当前指南中可能有关于使用版本文件的遗漏。

  • 啊,对了,你需要 `sdist` 发行版中的文件。因此,将其添加到“MANIFEST.in”是有意义的(尽管,是的 _setuptools_ 可以自动添加它,因为它知道它是必需的)。但在“wheel”或任何“bdist”中都不需要它。所以我想知道你是否真的需要 `include_package_data = True`... (2认同)