يُعد بناء أداة لسطر الأوامر (CLI) في بايثون طقس عبور للعديد من المطورين. سواء كان الأمر يتعلق بسكربت لمعالجة البيانات، أو أداة لأتمتة النشر، أو أداة لتشخيص النظام، فإن الوظيفة غالبًا ما تبدأ محليًا. ومع ذلك، فإن اللحظة التي تقرر فيها مشاركة هذه الأداة مع العالم، تظهر تحديات التغليف والتوزيع والتثبيت. على عكس تطبيقات الويب التي تعمل على خادم، يجب أن تكون أدوات سطر الأوامر قابلة للتنفيذ من أي مكان في بيئة طرفية المستخدم.
في هذا الدليل، سنستكشف المشهد الحديث لتغليف بايثون، متجاوزين ملفات setup.py القديمة لتبني معيار pyproject.toml. سنركز بشدة على الآلية الحاسمة المتمثلة في نقاط الدخول (entry points)، التي تعمل كجسر بين كود بايثون الخاص بك وسطح المستخدم، مما يضمن إمكانية استدعاء أداتك ببساطة عن طريق كتابة أمر.
المعيار الحديث: تبني pyproject.toml
لسنوات، اعتمد المطورون على setup.py و setup.cfg لوصف حزمهم. وعلى الرغم من وظيفتها، غالبًا ما عانت هذه الأساليب من الغموض فيما يتعلق ببيئات البناء والتبعيات. وقد اعتمدت مجتمع بايثون إلى حد كبير على pyproject.toml، وهو ملف تكوين يعمل كمصدر الحقيقة الوحيد لبيانات المشروع وتكوين البناء.
عند بناء أداة لسطر الأوامر، يجب أن يحدد ملف pyproject.toml الخاص بك بوضوح اسم المشروع وإصداره، والأهم من ذلك، البرامج النصية القابلة للتنفيذ. باستخدام setuptools كواجهة خلفية للبناء، يمكنك تعريف نقاط الدخول بشكل إعلاني دون إفساد كود المصدر.
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "my-cool-cli"
version = "1.0.0"
description = "أداة قوية لسطر الأوامر لتشخيص النظام"
authors = [{name = "فريق التطوير", email = "dev@example.com"}]
dependencies = [
"click>=8.0",
"requests>=2.28"
]
[project.scripts]
my-cli = "my_cool_cli.main:main"
[project.optional-dependencies]
dev = ["pytest", "black", "flake8"]
القسم الرئيسي هنا هو [project.scripts]. المفتاح (مثل my-cli) يصبح الأمر الذي يكتبه المستخدم في طرفيته، بينما يحدد القيمة مسار وحدة بايثون والدالة المراد تنفيذها.
فهم نقاط الدخول ومجموعات نقاط الدخول
نقاط الدخول في بايثون هي في الأساس اختصارات أو خطوط ربط. بالنسبة لأدوات سطر الأوامر، فإن مجموعة نقاط الدخول console_scripts هي المحرك الرئيسي. عندما يقوم المستخدم بتثبيت حزمك عبر pip، يقرأ المثبت نقاط الدخول console_scripts وينشئ برامج نصية قابلة للتنفيذ في مجلد bin أو Scripts الخاص ببيئة العمل.
لا تحتوي هذه البرامج النصية المُنشأة على تطبيقك بالكامل. بدلاً من ذلك، تعمل كمُطلقين صغيرين يستوردان الوحدة النمطية المحددة الخاصة بك ويُدعوان الدالة المخصصة. يضمن هذا الفصل أن منطق سطر الأوامر الخاص بك يظل معياريًا وقابلًا للاختبار.
فكر في هيكل حزمةك. بالنسبة لأداة سطر أوامر تسمى my-cool-cli، يجب أن يبدو هيكل المجلدات كالتالي:
my_cool_cli/
├── __init__.py
├── main.py
└── commands/
├── status.py
└── report.py
في ملف main.py، ستحدد الدالة المدخلة. إليك مثال عملي باستخدام مكتبة click الشهيرة، التي تعالج تحليل الحجج بذكاء:
import click
@click.command()
@click.option('--verbose', '-v', is_flag=True, help='تفعيل المخرجات المفصلة')
def main(verbose):
"""
أداة بسيطة لسطر الأوامر توضح نقاط الدخول.
"""
if verbose:
click.echo("جاري التشغيل في وضع التفاصيل...")
click.echo("مرحبًا من my-cool-cli!")
if __name__ == "__main__":
main()
لاحظ كتلة if __name__ == "__main__":. بينما تستدعي نقطة الدخول المحددة في pyproject.toml الدالة main مباشرةً، فإن الاحتفاظ بهذا الشرط هو أفضل ممارسة للاختبار المحلي ويضمن تشغيل السكربت بنظافة عند تنفيذه مباشرةً دون وسيطات.
تحسين التوزيع والتثبيت
بمجرد تكوين ملف pyproject.toml وإعداد نقاط الدخول، فإن الخطوة التالية هي ضمان تجربة توزيع سلسة. تتطلب سير عمل pip الحديثة أن يتم بناء حزمةك على شكل عجلة (تنسيق توزيع ثنائي) قبل رفعها إلى فهرس حزم بايثون (PyPI).
لبناء حزمةك، ستحتاج إلى وحدة build. قم بتشغيل الأمر التالي في الجذر الخاص بمشروعك:
python -m build
سيؤدي هذا إلى إنشاء مجلدي dist و build اللذين يحتويان على توزيع المصدر الخاص بك (.tar.gz) وملفات العجلة (.whl). عندما يقوم المستخدمون بتشغيل pip install my-cool-cli، فإنهم يقومون بتنزيل العجلة، ويقوم المثبت تلقائيًا بوضع أمر my-cli في بيئتهم، وتحديث متغير PATH إذا لزم الأمر.
من الضروري اختبار التثبيت في بيئة معزولة، مثل بيئة افتراضية أو حاوية Docker، للتأكد من عدم وجود تعارضات في التبعيات وأن الأمر يتم التعرف عليه بشكل صحيح بواسطة الطرفية.
الخلاصة
يتطلب تغليف أداة سطر أوامر في بايثون بشكل فعال تحولًا من تنفيذ السكربتات العشوائية إلى نهج منظم ومتوافق مع المعايير. من خلال الاستفادة من pyproject.toml وتكوين نقاط الدخول بشكل صحيح، تضمن أن تكون أداتك قابلة للاكتشاف وقابلة للتثبيت وقابلة للصيانة لك وللمجتمع.
تذكر أن جودة توزيعك لا تقل أهمية عن جودة كودك. لا تحل أداة سطر أوامر قوية مشكلة فحسب، بل توفر أيضًا تجربة مستخدم سلسة من خلال توثيق واضح، وتثبيت موثوق، وسلوك ثابت لسطر الأوامر. مع استمرار تطور بايثون، فإن الالتزام بهذه أفضل الممارسات سيضمن مستقبل أدواتك ويمكّنك من توزيع برمجياتك بثقة.