ساخت یک ابزار خط فرمان (CLI) در پایتون، یک مرحله گذار برای بسیاری از توسعهدهندگان است. چه این ابزار یک اسکریپت پردازش داده باشد، چه یک ابزار خودکارسازی استقرار، و چه یک ابزار عیبیابی سیستم، عملکرد آن اغلب به صورت محلی آغاز میشود. با این حال، به محض اینکه تصمیم به اشتراکگذاری این ابزار با جهان بگیرید، چالشهای بستهبندی، توزیع و نصب پدیدار میشوند. برخلاف برنامههای تحت وب که روی سرور اجرا میشوند، ابزارهای CLI باید از هر جای محیط ترمینال کاربر قابل اجرا باشند.
در این راهنما، ما در منظره مدرن بستهبندی پایتون حرکت میکنیم و از فایلهای قدیمی setup.py فراتر رفته و استاندارد pyproject.toml را میپذیریم. ما به شدت بر مکانیسم حیاتی نقاط ورودی (entry points) تمرکز خواهیم کرد که به عنوان پل ارتباطی بین کد پایتون شما و شل کاربر عمل میکنند و تضمین میکنند که ابزار شما تنها با تایپ یک دستور قابل فراخوانی باشد.
استاندارد مدرن: پذیرش pyproject.toml
برای سالها، توسعهدهندگان به setup.py و setup.cfg برای توصیف بستههای خود متکی بودند. اگرچه این رویکردها کارآمد بودند، اما اغلب با ابهام در مورد بکاندهای ساخت و وابستگیها روبرو بودند. جامعه پایتون عملاً بر pyproject.toml به عنوان یک فایل پیکربندی که به عنوان منبع حقیقت واحد برای متادیتای پروژه و پیکربندی ساخت عمل میکند، استاندارد شده است.
هنگام ساخت یک ابزار CLI، فایل 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 = "یک ابزار CLI قوی برای عیبیابی سیستم"
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) به دستوری تبدیل میشود که کاربر در ترمینال خود تایپ میکند، در حالی که مقدار، مسیر ماژول پایتون و تابعی که باید اجرا شود را تعریف میکند.
درک نقاط ورودی و گروههای نقاط ورودی
نقاط ورودی در پایتون اساساً میانبرها یا قلابهایی هستند. برای ابزارهای CLI، گروه نقطه ورودی console_scripts موتور محرک است. وقتی کاربر بسته شما را از طریق pip نصب میکند، نصبکننده نقاط ورودی console_scripts را میخواند و اسکریپتهای راهانداز اجرایی را در دایرکتوری bin یا Scripts محیط شما ایجاد میکند.
این اسکریپتهای تولید شده کل برنامه شما را در خود ندارند. در عوض، آنها به عنوان راهاندازهای کوچکی عمل میکنند که ماژول خاص شما را وارد کرده و تابع مشخص شده را فراخوانی میکنند. این جداسازی تضمین میکند که منطق CLI شما ماژولار و قابل تست باقی بماند.
ساختار بسته خود را در نظر بگیرید. برای یک ابزار CLI به نام 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):
"""
یک ابزار CLI ساده که نقاط ورودی را نشان میدهد.
"""
if verbose:
click.echo("در حال اجرا در حالت مفصل...")
click.echo("سلام از my-cool-cli!")
if __name__ == "__main__":
main()
بلوک if __name__ == "__main__": را مشاهده کنید. اگرچه نقطه ورودی تعریف شده در pyproject.toml تابع main را مستقیماً فراخوانی میکند، حفظ این شرط محافظتی یک بهترین روش برای تست محلی است و تضمین میکند که اسکریپت هنگام اجرای مستقیم بدون پارامترها به تمیزی اجرا شود.
بهینهسازی توزیع و نصب
پس از پیکربندی pyproject.toml و تنظیم نقاط ورودی، گام بعدی اطمینان از تجربه توزیع روان است. گردشهای کاری مدرن pip نیاز دارند که بسته شما قبل از آپلود در نمایه بسته پایتون (PyPI) به یک فایل wheel (فرمت توزیع باینری) تبدیل شود.
برای ساخت بسته خود، به ماژول build نیاز دارید. دستور زیر را در ریشه پروژه خود اجرا کنید:
python -m build
این کار دایرکتوریهای dist و build را ایجاد میکند که حاوی توزیع منبع (.tar.gz) و فایلهای wheel (.whl) شما هستند. وقتی کاربران دستور pip install my-cool-cli را اجرا میکنند، آنها فایل wheel را دانلود میکنند و نصبکننده به طور خودکار دستور my-cli را در محیط آنها قرار میدهد و در صورت نیاز PATH آنها را بهروزرسانی میکند.
بسیار مهم است که نصب خود را در یک محیط ایزوله، مانند محیط مجازی یا یک کانتینر Docker، تست کنید تا اطمینان حاصل کنید که هیچ تعارض وابستگی وجود ندارد و دستور توسط شل به درستی شناسایی میشود.
نتیجهگیری
بستهبندی مؤثر یک ابزار CLI پایتون نیازمند تغییر از اجرای اسکریپتهای لحظهای به یک رویکرد ساختاریافته و مطابقتیافته با استانداردها است. با بهرهگیری از pyproject.toml و پیکربندی صحیح نقاط ورودی، شما تضمین میکنید که ابزار شما برای شما و جامعه قابل کشف، نصب و نگهداری باشد.
به یاد داشته باشید که کیفیت توزیع شما به همان اندازه کیفیت کد شما مهم است. یک ابزار CLI قوی نه تنها مشکلی را حل میکند، بلکه یک تجربه کاربری روان از طریق مستندات واضح، نصب قابل اعتماد و رفتار خط فرمان سازگار ارائه میدهد. همانطور که پایتون به تکامل خود ادامه میدهد، پایبندی به این بهترین روشها ابزارهای شما را در برابر آینده ایمن کرده و به شما قدرت میدهد تا نرمافزار خود را با اطمینان توزیع کنید.