версия пакета с одним источником для проектов setup.cfg Python - PullRequest
1 голос
/ 27 февраля 2020

Для традиционных Python проектов с setup.py существуют различные способы гарантировать, что строка версии не должна повторяться по всей базе кода. Список рекомендаций см. В руководстве PyPA «Версия пакета из одного источника» .

Многие пытаются перейти от setup.py к setup.cfg (возможно, под влиянием PEP517 и PEP518 ; setup.py в большинстве случаев использовались в основном декларативно, а когда в setup.py была логика c, это, вероятно, было к худшему.) Это означает, что большинство предложения больше не будут работать, поскольку setup.cfg не может содержать «код».

Как я могу получить версию пакета из одного источника для Python проектов, использующих setup.cfg?

1 Ответ

2 голосов
/ 27 февраля 2020

Есть несколько способов сделать это:

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
...