Viele dieser Lösungen hier ignorieren git
Versions-Tags, was immer noch bedeutet, dass man die Version an mehreren Stellen verfolgen muss (schlecht). Ich habe dies mit den folgenden Zielen angegangen:
- Ableitung aller Python-Versionsreferenzen aus einem Tag in der
git
Repo
- Automatisieren Sie
git tag
/ push
y setup.py upload
Schritte mit einem einzigen Befehl, der keine Eingaben erfordert.
Wie es funktioniert:
-
Von einem make release
wird die letzte markierte Version im Git-Repository gefunden und hochgezählt. Das Tag wird zurück nach origin
.
-
En Makefile
speichert die Version in src/_version.py
wo sie gelesen wird von setup.py
und ebenfalls in der Mitteilung enthalten. Nicht prüfen _version.py
in die Versionskontrolle!
-
setup.py
Befehl liest die neue Versionszeichenfolge aus package.__version__
.
Einzelheiten:
Makefile
# remove optional 'v' and trailing hash "v1.0-N-HASH" -> "v1.0-N"
git_describe_ver = $(shell git describe --tags | sed -E -e 's/^v//' -e 's/(.*)-.*/\1/')
git_tag_ver = $(shell git describe --abbrev=0)
next_patch_ver = $(shell python versionbump.py --patch $(call git_tag_ver))
next_minor_ver = $(shell python versionbump.py --minor $(call git_tag_ver))
next_major_ver = $(shell python versionbump.py --major $(call git_tag_ver))
.PHONY: ${MODULE}/_version.py
${MODULE}/_version.py:
echo '__version__ = "$(call git_describe_ver)"' > $@
.PHONY: release
release: test lint mypy
git tag -a $(call next_patch_ver)
$(MAKE) ${MODULE}/_version.py
python setup.py check sdist upload # (legacy "upload" method)
# twine upload dist/* (preferred method)
git push origin master --tags
En release
target erhöht immer die 3. Versionsstelle, aber Sie können die next_minor_ver
o next_major_ver
um die anderen Ziffern zu erhöhen. Die Befehle stützen sich auf die versionbump.py
Skript, das in den Root des Repo eingecheckt wird
versionbump.py
"""An auto-increment tool for version strings."""
import sys
import unittest
import click
from click.testing import CliRunner # type: ignore
__version__ = '0.1'
MIN_DIGITS = 2
MAX_DIGITS = 3
@click.command()
@click.argument('version')
@click.option('--major', 'bump_idx', flag_value=0, help='Increment major number.')
@click.option('--minor', 'bump_idx', flag_value=1, help='Increment minor number.')
@click.option('--patch', 'bump_idx', flag_value=2, default=True, help='Increment patch number.')
def cli(version: str, bump_idx: int) -> None:
"""Bumps a MAJOR.MINOR.PATCH version string at the specified index location or 'patch' digit. An
optional 'v' prefix is allowed and will be included in the output if found."""
prefix = version[0] if version[0].isalpha() else ''
digits = version.lower().lstrip('v').split('.')
if len(digits) > MAX_DIGITS:
click.secho('ERROR: Too many digits', fg='red', err=True)
sys.exit(1)
digits = (digits + ['0'] * MAX_DIGITS)[:MAX_DIGITS] # Extend total digits to max.
digits[bump_idx] = str(int(digits[bump_idx]) + 1) # Increment the desired digit.
# Zero rightmost digits after bump position.
for i in range(bump_idx + 1, MAX_DIGITS):
digits[i] = '0'
digits = digits[:max(MIN_DIGITS, bump_idx + 1)] # Trim rightmost digits.
click.echo(prefix + '.'.join(digits), nl=False)
if __name__ == '__main__':
cli() # pylint: disable=no-value-for-parameter
Dies erledigt die schwere Aufgabe, die Versionsnummer von git
.
__init__.py
En my_module/_version.py
Datei wird importiert in my_module/__init__.py
. Fügen Sie hier die statische Installationskonfiguration ein, die Sie mit Ihrem Modul verteilen möchten.
from ._version import __version__
__author__ = ''
__email__ = ''
setup.py
Der letzte Schritt ist das Lesen der Versionsinformationen aus der Datei my_module
Modul.
from setuptools import setup, find_packages
pkg_vars = {}
with open("{MODULE}/_version.py") as fp:
exec(fp.read(), pkg_vars)
setup(
version=pkg_vars['__version__'],
...
...
)
Damit das alles funktioniert, müssen Sie natürlich mindestens ein Versions-Tag in Ihrem Repo haben.
git tag -a v0.0.1