setup.cfg Python项目的singlesourcing包版本

2024-06-10 03:53:06 发布

您现在位置:Python中文网/ 问答频道 /正文

对于带有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项目提供单一源代码包版本


Tags: 项目方法字符串代码py版本onsetup
1条回答
网友
1楼 · 发布于 2024-06-10 03:53:06

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

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

相关问题 更多 >