การใช้setuptools
และpbr
ไม่มีวิธีมาตรฐานในการจัดการเวอร์ชัน แต่วิธีมาตรฐานในการจัดการแพ็คเกจของคุณคือ setuptools
แต่วิธีมาตรฐานในการจัดการแพคเกจของคุณจะ
ทางออกที่ดีที่สุดที่ฉันพบโดยรวมสำหรับการจัดการเวอร์ชันคือการใช้setuptools
กับpbr
ส่วนขยาย นี่เป็นวิธีมาตรฐานในการจัดการเวอร์ชันของฉัน
การตั้งค่าโครงการของคุณสำหรับบรรจุภัณฑ์เต็มอาจเกินความจำเป็นสำหรับโครงการง่าย ๆ แต่ถ้าคุณต้องการจัดการเวอร์ชันคุณอาจอยู่ในระดับที่เหมาะสมในการตั้งค่าทุกอย่าง การทำเช่นนี้ยังช่วยให้แพคเกจของคุณ releasable ที่PyPiสามารถใช้งานได้เพื่อให้ทุกคนสามารถดาวน์โหลดและใช้กับ Pip ได้
PBR ย้ายข้อมูลเมตาส่วนใหญ่ออกจากsetup.py
เครื่องมือและเป็นsetup.cfg
ไฟล์ที่ใช้เป็นแหล่งข้อมูลเมตาดาต้าส่วนใหญ่ซึ่งอาจรวมถึงรุ่น สิ่งนี้ทำให้เมตะดาต้าสามารถจัดทำเป็นแพคเกจได้โดยใช้บางอย่างpyinstaller
ถ้าจำเป็น (ถ้าเป็นเช่นนั้นคุณอาจต้องใช้ข้อมูลนี้ ) และแยกเมทาดาทาออกจากสคริปต์การจัดการ / เซ็ตอัพแพ็คเกจอื่น ๆ คุณสามารถอัปเดตสตริงเวอร์ชันโดยตรงsetup.cfg
ด้วยตนเองและมันจะถูกดึงเข้าไปใน*.egg-info
โฟลเดอร์เมื่อสร้างแพ็คเกจของคุณ สคริปต์ของคุณสามารถเข้าถึงเวอร์ชันจากข้อมูลเมตาโดยใช้วิธีการต่าง ๆ (กระบวนการเหล่านี้มีการอธิบายไว้ในส่วนด้านล่าง)
เมื่อใช้ Git สำหรับ VCS / SCM การตั้งค่านี้จะดียิ่งขึ้นเนื่องจากมันจะดึงข้อมูลเมตาจำนวนมากจาก Git เพื่อให้ repo ของคุณสามารถเป็นแหล่งข้อมูลหลักของความจริงสำหรับข้อมูลเมตาบางส่วนรวมถึงรุ่นผู้เขียนรายการเปลี่ยนแปลง เป็นต้นสำหรับรุ่นโดยเฉพาะมันจะสร้างสตริงรุ่นสำหรับการกระทำปัจจุบันตามแท็ก git ใน repo
เนื่องจาก PBR จะดึงเวอร์ชันผู้สร้างการเปลี่ยนแปลงและข้อมูลอื่น ๆ โดยตรงจาก repo git ของคุณดังนั้นเมทาดาทาบางส่วนsetup.cfg
สามารถถูกปล่อยออกมาและสร้างอัตโนมัติเมื่อใดก็ตามที่มีการสร้างการแจกจ่ายสำหรับแพ็คเกจของคุณ (โดยใช้setup.py
)
รุ่นปัจจุบันเรียลไทม์
setuptools
จะดึงข้อมูลล่าสุดแบบเรียลไทม์โดยใช้setup.py
:
python setup.py --version
สิ่งนี้จะดึงเวอร์ชันล่าสุดทั้งจากsetup.cfg
ไฟล์หรือจาก git repo โดยยึดตามการคอมมิทล่าสุดที่สร้างขึ้นและแท็กที่มีอยู่ใน repo คำสั่งนี้ไม่ได้อัปเดตเวอร์ชันในการแจกจ่าย
กำลังอัปเดตเวอร์ชัน
เมื่อคุณสร้างการแจกจ่ายด้วยsetup.py
( py setup.py sdist
ตัวอย่างเช่น) จากนั้นข้อมูลปัจจุบันทั้งหมดจะถูกแยกและจัดเก็บไว้ในการกระจาย สิ่งนี้จะรันsetup.py --version
คำสั่งจากนั้นเก็บข้อมูลรุ่นนั้นไว้ในpackage.egg-info
โฟลเดอร์ในชุดของไฟล์ที่เก็บข้อมูลเมตาของการแจกจ่าย
หมายเหตุเกี่ยวกับกระบวนการอัปเดตข้อมูลเมตารุ่น:
หากคุณไม่ได้ใช้ pbr เพื่อดึงข้อมูลเวอร์ชันจาก git เพียงอัปเดต setup.cfg ของคุณโดยตรงด้วยข้อมูลเวอร์ชันใหม่ (ง่ายพอ แต่ให้แน่ใจว่านี่เป็นส่วนมาตรฐานของกระบวนการวางจำหน่ายของคุณ)
หากคุณใช้ git และคุณไม่จำเป็นต้องสร้างแหล่งที่มาหรือการแจกแจงแบบไบนารี (การใช้python setup.py sdist
หรือpython setup.py bdist_xxx
คำสั่งอย่างใดอย่างหนึ่ง) วิธีที่ง่ายที่สุดในการอัปเดตข้อมูล git repo ลงใน<mypackage>.egg-info
โฟลเดอร์ข้อมูลเมตาของคุณคือการเรียกใช้python setup.py install
คำสั่ง สิ่งนี้จะเรียกใช้ฟังก์ชัน PBR ทั้งหมดที่เกี่ยวข้องกับการดึงข้อมูลเมตาจาก git repo และอัปเดต.egg-info
โฟลเดอร์ในเครื่องของคุณติดตั้งโปรแกรมปฏิบัติการสคริปต์สำหรับจุดเข้าใช้งานใด ๆ ที่คุณกำหนดไว้และฟังก์ชั่นอื่น ๆ
โปรดทราบว่า.egg-info
โดยทั่วไปโฟลเดอร์จะถูกยกเว้นไม่ให้ถูกเก็บไว้ใน git repo ใน.gitignore
ไฟล์Python มาตรฐาน(เช่นจากGitignore.IO ) เนื่องจากสามารถสร้างได้จากแหล่งที่มาของคุณ หากไม่ได้รับการยกเว้นตรวจสอบให้แน่ใจว่าคุณมี "กระบวนการเผยแพร่" มาตรฐานเพื่อรับข้อมูลเมตาที่อัปเดตในเครื่องก่อนที่จะเผยแพร่และแพ็คเกจใด ๆ ที่คุณอัปโหลดไปยัง PyPi.org หรือเผยแพร่อย่างอื่นจะต้องมีข้อมูลนี้ หากคุณต้องการให้ Git repo มีข้อมูลนี้คุณสามารถยกเว้นไฟล์บางไฟล์จากการถูกละเว้น (เช่นเพิ่ม!*.egg-info/PKG_INFO
ไป.gitignore
)
การเข้าถึงเวอร์ชันจากสคริปต์
คุณสามารถเข้าถึงข้อมูลเมตาได้จากบิลด์ปัจจุบันภายในสคริปต์ Python ในแพ็คเกจเอง ตัวอย่างเช่นสำหรับรุ่นมีหลายวิธีในการทำเช่นนี้ฉันได้พบ:
## 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))
คุณสามารถใส่หนึ่งในสิ่งเหล่านี้ลงใน__init__.py
แพคเกจของคุณโดยตรงเพื่อดึงข้อมูลเวอร์ชั่นดังต่อไปนี้คล้ายกับคำตอบอื่น ๆ :
__all__ = (
'__version__',
'my_package_name'
)
import pkg_resources # part of setuptools
__version__ = pkg_resources.get_distribution("mypackage").version