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 setuptools
denganpbr
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.py
alat dan ke setup.cfg
file 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 pyinstaller
jika 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.cfg
secara 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.cfg
dapat ditinggalkan dan dibuat secara otomatis setiap kali distribusi dibuat untuk paket Anda (menggunakan setup.py
)
Versi aktual saat ini
setuptools
akan 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 --version
perintah dan kemudian menyimpan info versi itu ke package.egg-info
folder 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 sdist
atau salah satu python setup.py bdist_xxx
perintah) cara termudah untuk memperbarui info repo git ke <mypackage>.egg-info
folder metadata Anda adalah dengan menjalankan python setup.py install
perintah. Ini akan menjalankan semua fungsi PBR yang terkait dengan menarik metadata dari git repo dan memperbarui .egg-info
folder 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-info
folder tersebut secara umum dikecualikan dari yang disimpan dalam git repo itu sendiri dalam .gitignore
file 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_INFO
ke .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__.py
ke 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