首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setup.cfg元数据中的“版本”条目被忽略。

setup.cfg元数据中的“版本”条目被忽略。
EN

Stack Overflow用户
提问于 2021-11-06 02:21:07
回答 1查看 794关注 0票数 2

我想编写一个新的Python包,我想通过PyPI提供这个包。过去,我总是使用setup.py。但这一次,我决定接受使用setup.cfg的新的最佳实践。因此,我开始阅读一些文档,主要是config.html

我还决定使用吡咯烷酮生成文件。pyscaffold为我生成了一个setup.cfg文件,我(只是为了测试目的)在metadata部分下添加了version = 5.1.1,如上面的文档所描述的那样。

为了方便起见,我使用anaconda并创建了一个新的空环境:

代码语言:javascript
复制
$ python --version
Python 3.9.7
$  pip list
...
PyScaffold                    4.1.1
setuptools                    58.4.0
setuptools-scm                6.3.2
wheel                         0.37.0

但是,当我执行pip install -e .时,版本被忽略了,pip分配了一个不同的版本:

代码语言:javascript
复制
$ pip install -e .
Obtaining file:///tmp/test_package
  Installing build dependencies ... done
  Checking if build backend supports build_editable ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Installing collected packages: test-package
  Attempting uninstall: test-package
    Found existing installation: test-package 0.0.post1.dev10+g3ed39c8.d20211106
    Uninstalling test-package-0.0.post1.dev10+g3ed39c8.d20211106:
      Successfully uninstalled test-package-0.0.post1.dev10+g3ed39c8.d20211106
  Running setup.py develop for test-package
Successfully installed test-package-0.0.post1.dev1+g228b46c

https://stackoverflow.com/a/27077610/1480131提到setupToolsVersion30.3.0支持在setup.cfg中放置元数据,我使用的是58.4.0,所以是一个更新的版本。

我也用version = file:VERSION.txt这样的不同格式进行了测试,但这也没有帮助,pip只是忽略了version条目。

我遗漏了什么?我做错了什么?

为了能够重现错误,我准备了一个带有文件的小型git:套餐,有人得到了不同的结果吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-06 14:48:49

这是因为pyscaffold生成了一个使用setuptools-scm进行版本检测的项目。当使用setuptools-scm时,版本不是从version元数据中读取的,而是从存储库标记中解析的。0.0.post1.dev10+g3ed39c8.d20211106版本可以如下所示:

  • 0.0.post1 -虚拟版本,因为你还没有任何标签在回购;
  • dev10 --您有10个未包含在任何版本标记中的提交(基本上是自上次标记以来提交的数量);
  • g3ed39c8 -您从3ed39c8安装的提交的简短散列(前缀g表示它是一个Git );
  • d20211106 - d意味着您已经从一个脏的状态安装了( Git修改了一些版本的文件),剩下的只是时间戳。

如果要使用来自setup.cfg的版本元数据,只需在setup.py中删除setuptools-scm激活即可。

代码语言:javascript
复制
if __name__ == "__main__":
    try:
        setup()
    except:
        ...

然后,您也可以清除pyproject.toml,尽管这并不是明确要求的:

代码语言:javascript
复制
[build-system]
requires = ["setuptools>=46.1.0", "wheel"]
build-backend = "setuptools.build_meta"

如果您想继续使用setuptools-scm ( IMO是防止您意外发布相同版本但内容不同的dists的一个很好的工具),那么只需添加一个新的标记开始版本控制:

代码语言:javascript
复制
$ git tag -a 5.1.1 -m 'start versioning'

如果您有一个干净的回购状态(没有修改的文件),pip install -e .将立即安装5.1.1版本。否则,您将得到一个带有后缀的5.1.1。

使用setuptools-scm的好处是忽略了setup.cfg中的版本元数据,因此您不必自己去碰它,并且可以安全地删除version = 5.1.1行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69860987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档