Menggunakan setuptools danpbr
Tidak ada cara standar untuk mengelola versi, tetapi cara standar untuk mengelola paket Anda adalah setuptools .
Solusi terbaik yang saya temukan secara keseluruhan untuk mengelola versi adalah menggunakan setuptoolsdenganpbr ekstensi. Ini sekarang cara standar saya mengelola versi.
Menyiapkan proyek Anda untuk pengemasan penuh mungkin berlebihan untuk proyek-proyek sederhana, tetapi jika Anda perlu mengelola versi, Anda mungkin berada pada level yang tepat untuk hanya mengatur semuanya. Melakukan hal itu juga membuat paket Anda dapat dirilis di PyPi sehingga semua orang dapat mengunduh dan menggunakannya dengan Pip.
PBR memindahkan sebagian besar metadata dari setup.pyalat dan ke setup.cfgfile yang kemudian digunakan sebagai sumber untuk sebagian besar metadata, yang dapat menyertakan versi. Ini memungkinkan metadata untuk dikemas menjadi yang dapat dieksekusi menggunakan sesuatu seperti pyinstallerjika diperlukan (jika demikian, Anda mungkin akan memerlukan info ini ), dan memisahkan metadata dari skrip pengaturan / pengaturan paket lainnya. Anda dapat langsung memperbarui string versi setup.cfgsecara manual, dan itu akan ditarik ke dalam*.egg-info folder saat membangun rilis paket Anda. Skrip Anda kemudian dapat mengakses versi dari metadata menggunakan berbagai metode (proses ini diuraikan dalam bagian di bawah).
Saat menggunakan Git untuk VCS / SCM, pengaturan ini bahkan lebih baik, karena akan menarik banyak metadata dari Git sehingga repo Anda dapat menjadi sumber kebenaran utama Anda untuk beberapa metadata, termasuk versi, penulis, changelogs, dll. Untuk versi khusus, itu akan membuat string versi untuk komit saat ini berdasarkan pada tag git di repo.
Karena PBR akan menarik versi, penulis, changelog, dan info lainnya langsung dari repo git Anda, sehingga beberapa metadata di setup.cfgdapat ditinggalkan dan dibuat secara otomatis setiap kali distribusi dibuat untuk paket Anda (menggunakan setup.py)
Versi aktual saat ini
setuptoolsakan menarik info terbaru secara real-time menggunakan setup.py:
python setup.py --version
Ini akan menarik versi terbaru dari setup.cfg file, atau dari repo git, berdasarkan komit terbaru yang dibuat dan tag yang ada di repo. Perintah ini tidak memperbarui versi dalam distribusi.
Memperbarui versi
Ketika Anda membuat distribusi dengan setup.py(misalnya py setup.py sdist, misalnya), maka semua info saat ini akan diekstraksi dan disimpan dalam distribusi. Ini pada dasarnya menjalankan setup.py --versionperintah dan kemudian menyimpan info versi itu ke package.egg-infofolder dalam satu set file yang menyimpan metadata distribusi.
Catatan tentang proses untuk memperbarui meta-data versi:
Jika Anda tidak menggunakan pbr untuk menarik data versi dari git, maka perbarui saja setup.cfg Anda langsung dengan info versi baru (cukup mudah, tetapi pastikan ini adalah bagian standar dari proses rilis Anda).
Jika Anda menggunakan git, dan Anda tidak perlu membuat sumber atau distribusi biner (menggunakan python setup.py sdistatau salah satu python setup.py bdist_xxxperintah) cara termudah untuk memperbarui info repo git ke <mypackage>.egg-infofolder metadata Anda adalah dengan menjalankan python setup.py installperintah. Ini akan menjalankan semua fungsi PBR yang terkait dengan menarik metadata dari git repo dan memperbarui .egg-infofolder lokal Anda , menginstal skrip yang dapat dieksekusi untuk setiap titik masuk yang telah Anda tentukan, dan fungsi lain yang dapat Anda lihat dari output ketika Anda menjalankan perintah ini.
Perhatikan bahwa .egg-infofolder tersebut secara umum dikecualikan dari yang disimpan dalam git repo itu sendiri dalam .gitignorefile Python standar (seperti dari Gitignore.IO ), karena dapat dihasilkan dari sumber Anda. Jika dikecualikan, pastikan Anda memiliki "proses rilis" standar untuk memperbarui metadata secara lokal sebelum rilis, dan paket apa pun yang Anda unggah ke PyPi.org atau didistribusikan harus menyertakan data ini untuk memiliki versi yang benar. Jika Anda ingin repo Git berisi info ini, Anda dapat mengecualikan file tertentu agar tidak diabaikan (yaitu menambahkan !*.egg-info/PKG_INFOke .gitignore)
Mengakses versi dari skrip
Anda bisa mengakses metadata dari build saat ini di dalam skrip Python dalam paket itu sendiri. Untuk versi, misalnya, ada beberapa cara untuk melakukan ini yang saya temukan sejauh ini:
## This one is a new built-in as of Python 3.8.0 should become the standard
from importlib-metadata import version
v0 = version("mypackage")
print('v0 {}'.format(v0))
## I don't like this one because the version method is hidden
import pkg_resources # part of setuptools
v1 = pkg_resources.require("mypackage")[0].version
print('v1 {}'.format(v1))
# Probably best for pre v3.8.0 - the output without .version is just a longer string with
# both the package name, a space, and the version string
import pkg_resources # part of setuptools
v2 = pkg_resources.get_distribution('mypackage').version
print('v2 {}'.format(v2))
## This one seems to be slower, and with pyinstaller makes the exe a lot bigger
from pbr.version import VersionInfo
v3 = VersionInfo('mypackage').release_string()
print('v3 {}'.format(v3))
Anda dapat memasukkan salah satu dari ini secara langsung __init__.pyke dalam paket Anda untuk mengekstrak info versi sebagai berikut, mirip dengan beberapa jawaban lain:
__all__ = (
'__version__',
'my_package_name'
)
import pkg_resources # part of setuptools
__version__ = pkg_resources.get_distribution("mypackage").version