【问题标题】:single-sourcing package version for setup.cfg Python projectssetup.cfg Python 项目的单源包版本
【发布时间】:2020-06-11 06:46:19
【问题描述】:

对于带有setup.py 的传统 Python 项目,有多种方法可以确保版本字符串不必在整个代码库中重复。有关推荐列表,请参阅 PyPA's guide on "Single-sourcing the package version"

许多人正试图从setup.py 转移到setup.cfg(可能是在PEP517PEP518 的影响下;无论如何setup.py 大多以声明方式使用,当setup.py 中有逻辑时,情况可能更糟。)这意味着大多数建议将不再有效,因为setup.cfg 不能包含“代码”。

如何为使用 setup.cfg 的 Python 项目提供包版本的单一来源?

【问题讨论】:

  • 我不会调用 PyPA 及其指南和教程 official(但它们是最接近 Python 打包的 官方 的)。 setup.cfgPEP 517PEP 518 没有太大关系,它早就存在(但是是的,我明白你的意思)。并且您需要 PyPA 建议的第 5 版。
  • @sinoroc 非常感谢您的评论。随意编辑帖子以使其更正确,我会立即批准。
  • 对不起,挑剔,绝对没有必要。无论如何,由于它使用setup.py 中的代码,因此不能直接回答您的问题,但这是我在项目中的做法:sinoroc.gitlab.io/kb/python/project_version.html

标签: python setup.py


【解决方案1】:

有几种方法可以做到这一点(见下文这些示例中使用的项目结构):

1.

setup.cfg

[metadata]
version = 1.2.3.dev4

src/my_top_level_package/__init__.py

import importlib.metadata
__version__ = importlib.metadata.version('MyProject')

2.

setup.cfg

[metadata]
version = file: VERSION.txt

VERSION.txt

1.2.3.dev4

src/my_top_level_package/__init__.py

import importlib.metadata
__version__ = importlib.metadata.version('MyProject')

3.

setup.cfg

[metadata]
version = attr: my_top_level_package.__version__

src/my_top_level_package/__init__.py

__version__ = '1.2.3.dev4'

还有更多...

可能还有其他方法可以做到这一点,通过玩不同的组合。


参考文献


前面例子中假设的结构如下...

MyProject
├── setup.cfg
├── setup.py
└── src
    └── my_top_level_package
        └── __init__.py

setup.py

#!/usr/bin/env python3

import setuptools

if __name__ == '__main__':
    setuptools.setup(
        # see 'setup.cfg'
    )

setup.cfg

[metadata]
name = MyProject
version = attr: my_top_level_package.__version__

[options]
package_dir =
    = src
packages = find:

[options.packages.find]
where = src

src/my_top_level_package/__init__.py

__version__ = '1.2.3.dev4'
$ cd path/to/MyProject
$ python3 setup.py --version
1.2.3.dev4
$ python3 -m pip install .
# ...
$ python3 -c 'import my_top_level_package; print(my_top_level_package.__version__)'
1.2.3.dev4
$ python3 -V
Python 3.6.9
$ python3 -m pip list
Package       Version   
------------- ----------
MyProject     1.2.3.dev4
pip           20.0.2    
pkg-resources 0.0.0     
setuptools    45.2.0    
wheel         0.34.2    
zipp          3.0.0

【讨论】:

  • importlib.metadata 变体的缺点是它总是给出 已安装 包的版本,即使您使用 devel master 的结帐,例如。
  • 选项 (3.) 不起作用。该软件包不会使用pip install . 与看似无关的ModuleNotFoundErrors 在本地安装。在[metadata] 中使用version = 1.2.3 时,一切正常。可能是一个 pip 错误,不确定。
  • 我不确定,因为 src-layout 的事情,但(3)似乎对我有用,除非我做错了什么,比如在尝试之间没有正确清理剩余的元数据。
  • (3) 对我不起作用。将我的代码放入src/foobar 时,pip install . 告诉我ModuleNotFoundError: No module named 'foobar'——也可以理解。也许我误解了my_top_level_package
猜你喜欢
  • 2023-02-10
  • 2022-11-29
  • 2021-12-19
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2019-02-01
相关资源
最近更新 更多