تكمن قوة بايثون في نظامها البيئي الواسع من المكتبات الخارجية. ومع ذلك، بالنسبة للعديد من المطورين، تظل الرحلة من كتابة سكربت إلى توزيع حزمة قوية غامضة. يعد فهم كيفية تغليف وبناء وتوزيع مشاريع بايثون بشكل صحيح أمراً أساسياً لأي مطور متوسط إلى متقدم يرغب في مشاركة الكود، أو التعاون في مشاريع مفتوحة المصدر، أو نشر الأدوات الداخلية على فهرس خاص.
في هذا الدليل، سنكشف الغموض عن مشهد تغليف بايثون الحديث. سننتقل بعيداً عن النموذج القديم والمفرط في التعقيد setup.py ونتبنى المعايير الأحدث والأكثر متانة التي توصي بها هيئة تغليف بايثون (PyPA).
التحول من Setuptools إلى PEP 517/518
تاريخياً، اعتمد تغليف بايثون بشكل كبير على setuptools وملف setup.py الطويل. وعلى الرغم من كونه فعالاً، إلا أن هذا النهج غالباً ما أدى إلى عمليات بناء هشة وتضخم في التكوين. انتقلت المجتمع منذ ذلك الحين نحو واجهات خلفية قياسية للبناء محددة في PEP 517 وPEP 518.
يقدم المعيار الجديد ملفين رئيسيين:
- pyproject.toml: يعلن عن متطلبات البناء وبيانات تعريف المشروع.
- واجهة خلفية للبناء (build backend): أداة مثل
setuptoolsأوpoetryأوflitالتي تقوم بعملية البناء الفعلية.
تحديد بنية مشروعك
تُعد بنية المشروع النظيفة أساس الحافظة القابلة للصيانة. وعلى الرغم من وجود العديد من الاختلافات، إلا أن التخطيط الحديث الشائع يبدو كالتالي:
my_package/
├── pyproject.toml
├── README.md
├── LICENSE
└── src/
└── my_package/
├── __init__.py
├── core.py
└── utils.py
يُوصى بشدة باستخدام تخطيط src/. فهو يمنع الاستيراد العرضي للملفات المحلية أثناء الاختبار ويضمن أن الحزمة المثبتة هي دائماً ما يتم اختباره، وليس شفرة المصدر الموجودة في دليلك الحالي.
تكوين pyproject.toml
يُعد ملف pyproject.toml المصدر الوحيد الموثوق لبيانات تعريف مشروعك. فيما يلي مثال على التكوين باستخدام setuptools كواجهة خلفية للبناء، وهو المعيار الأكثر انتشاراً.
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "my-awesome-package"
version = "0.1.0"
description = "A sample Python package for demonstration."
readme = "README.md"
license = {text = "MIT"}
requires-python = ">=3.8"
authors = [
{name = "Jane Developer", email = "jane@example.com"},
]
dependencies = [
"requests>=2.28.0",
"click>=8.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"black>=22.0.0",
]
الميزات الرئيسية التي يجب ملاحظتها في هذا التكوين:
- بيانات تعريف ديناميكية: يمكنك أرقام الإصدارات في ملفات منفصلة لتجنب التحديثات اليدوية.
- التبعيات الاختيارية: يمكن للمستخدمين تثبيت أدوات التطوير عبر الأمر
pip install my-package[dev]. - قيد إصدار بايثون: يضمن التعريف الصريح لـ
requires-python إجراء فحوصات التوافق.
البناء والتوزيع
بمجرد تكوين ملف pyproject.toml، يصبح بناء حزمك أمراً بسيطاً. أولاً، تأكد من تثبيت أحدث أدوات البناء:
pip install build twine
ثم، قم بتشغيل أمر البناء من جذر مشروعك. يقوم هذا الأمر بإنشاء دليل dist/ يحتوي على توزيع المصدر (sdist) وملف wheel.
python -m build
سيبدو المخرج كالتالي:
Creating sdist archive: dist/my_awesome_package-0.1.0.tar.gz
Creating wheel archive: dist/my_awesome_package-0.1.0-py3-none-any.whl
يحتوي Sdist على شفرة المصدر ويتطلب بيئة المستخدم لبناء ملف wheel أثناء التثبيت. بينما يُعد Wheel توزيعاً مبنياً مسبقاً وجاهزاً للتثبيت، وهو بشكل عام أسرع ومفضل لمعظم حالات الاستخدام.
الاختبار قبل النشر
لا تنشر مباشرة إلى فهرس PyPI الحي. بدلاً من ذلك، استخدم TestPyPI، وهو مثيل منفصل للاختبار.
- أنشئ حساباً في test.pypi.org.
- قم بإنشاء رمز API في إعدادات حسابك.
- قم برفع حزمك باستخدام
twine:
twine upload --repository testpypi dist/*
يمكنك بعد ذلك اختبار التثبيت في بيئة افتراضية نظيفة:
pip install --index-url https://test.pypi.org/simple/ --no-deps my-awesome-package
الخاتمة
لقد تطور تغليف بايثون بشكل كبير، متجهاً نحو التوحيد القياسي وسهولة الاستخدام. من خلال اعتماد الأدوات الحديثة واتباع أفضل الممارسات مثل تخطيط src/ والتكوين الصحيح لملف pyproject.toml، تضمن أن تكون حزمك متينة وقابلة للتكرار وسهلة الاستخدام للآخرين. سواء كنت تشارك مكتبة مع المجتمع أو تنشر أدوات داخلية، فإن إتقان هذه الخطوات مهارة حاسمة في مجموعة أدوات مطور بايثون الحديث.